原码、反码、补码
作者:互联网
一. 机器数和机器数的真值
在了解原码, 反码和补码之前, 需要先了解机器数和真值的概念.
1.机器数:一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.
比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。
那么,这里的 00000011 和 10000011 就是机器数。
2.真值:因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1
原码,反码,补码的基础概念和计算方法
1.原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:
[1111 1111 , 0111 1111]
即[-127 , 127]
原码是人脑最容易理解和计算的表示方式.
2.反码
反码的表示方法是:
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.
3. 补码
补码的表示方法是:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
对于负数, 补码表示方式也是人脑无法直观看出其数值的.通常也需要转换成原码在计算其数值.
原码的缺陷:
使用原码直接进行运算,对于加法是没有问题的
原码最大的问题是,无法将减法转换为加法。例如3-2,我们可以通过计算3+(-2)得到结果,原码的计算结果是-5,明显是错误的。
反码的瑕疵:
反码的出现正是弥补了原码无法执行减法运算的问题,反码运算减法的规则:A-B=A+(-B),如果最高位发生了进位,则需要低位再加1。
反码的计算结果是对的,但是算法规则稍微有点复杂,需要考虑最高位溢位的情况,效率偏低,另外还有一点瑕疵:0有两种编码。
以1-1为例,反码的计算过程如下,结果为-0,其实也就是0。我们发现,在反码中,00000000和11111111都表示0,0有两种编码,在判断是否为0时需要判断两种编码,算是一点小瑕疵。
补码的完美:
补码是现代计算机使用的编码格式,同时解决了原码的缺陷和反码的瑕疵。
其次,0不再有两种编码了,还是以1-1为例,计算过程如下,0只有一个编码,那就是00000000
。既然00000000
代表1,那11111111
代表什么呢?此时人为的规定它就是-128D,所以使用补码,1个字节的表示范围是[-128,127],比反码还多了一个数值。
标签:真值,机器,0001,补码,反码,原码 来源: https://www.cnblogs.com/ysk0904/p/16677897.html