整数的原码_反码和补码总结(转载)

教育 网编 2023-03-06 18:46 232 0

  一.整数的原码,反码和补码

  A能力:当面对一个整数时,写出相对应的原码,反码和补码。

  整数(正整数,零和负整数)的表示有三种方法,分别是:

  原码表示法(符号大小(sign-and-magnitude)表示法)

  反码表示法(1的补码(one's complement)表示法)

  补码表示法(2的补码(two's complement)表示法)

  1.正整数的原码,反码和补码

  当面对一个正整数时,写出相对应的n位原码,n位反码和n位补码的规则是相同的,具体如下:最左的位为0;写出此正整数相对应的二进制数,然后将所得结果放到最右边;中间剩余的位全为0.

  例题1:正整数27所对应的8位原码,8位反码和8位补码分别是什么?它们是否相同?

  例题2:正整数15所对应的8位原码和16位原码分别是什么?

  2.负整数的原码,反码和补码

  1)负整数的原码

  当面对一个负整数时,写出相对应n位原码的规则如下:最左的位为1;写出此负整数的绝对值相对应的二进制数,然后将所得结果放到最右边;中间剩余的位全为0.

  例题:负整数-25所对应的8位原码是什么? 答案:1001 1001

  2)负整数的反码

  当面对一个负整数时,写出相对应n位反码的规则如下:最左的位为1;写出此负整数的绝对值所对应的二进制数,然后将所得结果放到最右边;中间剩余位全为0;最后将最右边的n-1位全部取反(0变为1,1变为0)。

  例题:负整数-25所对应的8位反码是什么? 答案:1110 0110

  3)负整数的补码

  当面对一个负整数时,写出相对应n位补码的规则如下:最左的位为1;写出此负整数的绝对值所对应的二进制数,然后将所得结果放到最右边;中间剩余位全为0;

  将最右边的n-1位全部取反;在最低位加1。

  例题:负整数-25所对应的8位补码和16位补码分别是什么? 答案:1110 0111 和 1111 1111

  3.零的原码,反码和补码

  在计算机科学中,零有正零(+0)和负零(-0)之分。在求+0的原码,反码和补码时,可将+0视为正整数,并套用前面所讲的求正整数的原码,反码和补码的规则;在求-0的原码和反码时,可以将-0视为负整数,并套用前面所讲的求负整数的原码和反码的规则;但是在求-0的补码时,不可以将-0视为负整数,并进而套用前面所讲规则,因为若套用前面所讲规则时,会出现一个意外,就是最高位向前还有一个进位。关于-0的补码只要记住其和+0的补码是相同的就可以了。

  +0的4位原码和-0的4位原码是不一样的,分别是0000和1000;+0的4位反码和-0的4位反码是不一样的,分别是0000和1111;+0的4位补码和-0的4位补码是一样的,都是0000。

  4.求负整数的反码和补码的新方法

  1)求负整数的反码的新方法

  当面对一个负整数x时,求其n位反码的新方法如下:计算表达式(2^n)-1-|x|的值;将所得的值转化为n位二进制数,所得结果即为所对应的反码。

  例题:采用新方法求-25所对应的8位反码。答案为:1110 0110

  2)求负整数的补码的新方法

  当面对一个负整数x时,求其n位补码的新方法如下:计算表达式(2^n)-|x|的值;将所得的值转化为n位二进制数,所得结果既为所对应的补码。

  例题:采用新方法求-25所对应的8位补码。答案:1110 0111

  5.从原码,反码和补码到整数

  当面对某个整数的n位原码,n位反码和n位补码时,求出相应整数的规则如下:

  1)由原码到整数

  当面对某整数的n位原码时,求相应整数的规则为:将右边的n-1位由0和1组成的串视为二进制整数,求出相应十进制整数;若最高位为0,则在求出的十进制整数前加上符号'+';若为1,则加上符号'-'。

  例题:求出8位原码0111 0100和1000 0101所对应的整数。

  2)由反码到整数

  当面对某整数的n位反码时,求出相应整数的规则为:若最高位为0,则将其余n-1位由0和1组成的串视为二进制整数,求出相应十进制整数,然后在求得的十进制整数前加上符号‘+’;若最高位为1,则将这n位由0和1组成的串视为二进制正整数,然后求出对应的十进制整数x,然后计算表达式(2^n)-1-x的值,最后在所求得的值前加上符号‘-’。

  例题:求出8位反码1110 0110所对应的整数 答案:-25

  3)由补码到整数

  当面对某个整数的n位补码时,求出相应整数的规则为:

  A:若所面对的n位补码的最高位为0,而且其余n-1位不全为0时,将这n-1位由0和1组成的串视为二进制数,然后求出相应的十进制数,最后在求出的十进制数前加上符号'+'就可以了。

  B:若所面对的n位补码的最高位为0,且其余n-1位全为0时,则此补码对应两个整数,分别为正零(+0)和负零(-0)。

  C:若所面对的n位补码的最高位为1,将此n位由0和1组成的串视为二进制整数,求出对应的十进制整数x,然后计算表达式(2^n)-x的值,最后在所求得值之前加上符号'-'.

  6.使用上述三种表示法所能表示的整数范围

  1)使用n位原码表示法所能表示的最大整数为(2^(n-1))-1,所能表示的最小整数为-((2^(n-1))-1)。

  2)使用n位反码表示法所能表示的最大整数同上,所能表示的最小整数同上。

  3)使用n位补码表示法所能表示的最大整数同上,所能表示的最小整数为-(2^(n-1))

  例题1:-9的4位补码是否存在?答案:不存在。

  例题1的分析:当遇到类似的题目时,首先判断给出的整数是否处于所能表示的整数范围之内,若处于的话,再去计算所对应的补码是什么?

  例题2:-8的4位补码是否存在?若存在是什么?答案:存在,是1000。

  例题2的分析:-8处于4位补码所能表示的整数范围,但是在计算-8的4位补码时,不可以套用前面的旧方法,只可以去套用前面所讲的新方法。

  7.对旧方法和新方法的补充说明

  在求负整数所对应的n位补码时,提倡采用的方法应为新方法,而不是旧方法。

  8.使用补码执行加法和减法运算

  在计算机内部表示一个整数时,所采用的表示法为补码表示法。原码和反码的存在主要是为了说明如何求出补码.

  定理:设x和y是两个整数,且都存在对应的n位补码,且x+y也存在对应的n位补码,那么x的补码加上y的补码等于(x+y)的补码。

  例题1:25的8位补码是0001 1001,32的8位补码是0010 0000;32与25的和为57,57的8位补码为0011 1001;将25的补码和32的补码都视为二进制正整数,然后执行加法运算后,得到的就是0011 1001。

  例题2:在计算机中,计算表达式25-32的值时,过程如下:首先求出25和-32的补码,然后将这两者的补码视为二进制正整数,然后执行加法运算,所得结果就是表达式25-32的值的补码,然后再计算此补码所对应的整数是什么。

  总结:int a=-3;上面这条语句将a定义为int型,并在定义的同时进行赋值为-3。编译器为变量a所分配的内存空间的大小为两个字节,也就是16位。这两个字节中所存储的就是-3的16位补码。请注意不同的编译器为int型的变量所分配的内存空间的大小是不同的,例如visual c++中的C语言编译器为int型的变量所分配的内存空间的大小为4个字节,这样的话,变量a所对应的那四个字节的内存空间中存储的就是-3的32位补码。

  提示:将来可能有人给你这样一个题目:求出-3的补码。这个题目本身是有问题的。正确的问法为:求出-3的8位,或16位,或32位补码。

  实验:int a=-3; printf(“%x”,a);上面这条语句的作用是将变量a所对应的16位补码,打印出来。例如打印出来的结果为fffd。将fffd中的每一个16进制数字转为二进制数得出的结果为1111 1111 1111 1101。上面这个16位01串(所谓的01串就是由数字0与1构成的符号串)就是-3的补码。

  

评论区