计算机说 - 原码、反码和补码
机器数
一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1。比如,十进制数 +3 ,计算机字长为8位,转换成二进制就是0000 0011,如果是 -3 ,就是1000 0011 。那么,这里的0000 0011和1000 0011就是机器数
真值
因为有符号位,所以机器数的形式值就不等于真正的数值。例如,上面的有符号数1000 0011,其最高位1代表负,其真正数值是 -3 而不是形式值131。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值:0000 0001的真值 = +000 0001 = +1;1000 0001的真值 = –000 0001 = –1
原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值,如:+1 = 0000 0001,-1 = 1000 0001,第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就
反码
反码的表示方法是:正数的反码是其本身;负数的反码是在其原码的基础上, 符号位不变,其余各个位取反,如:+1 = 0000 0001(原) = 0000 0001(反);-1 = 1000 0001(原)= 1111 1110(反)
补码
1 – 补码的表示方法是:正数的补码就是其本身;负数的补码是在其原码的基础上,符号位不变,其余各位取反,,最后 +1(即在反码的基础上 +1),如:+1 = 0000 0001(原)= 0000 0001(反)= 0000 0001(补);-1 = 1000 0001(原)= 1111 1110(反)= 1111 1111(补)
2 – 补码表示的溢出问题
(1)由于计算机中的数字用补码表示,例如8位的 byte 类型的表示范围为:[-127, 127],如:0 = 0000 0000(补),-128 = 1000 0000(补),127 = 0111 1111(补码)。当 byte 类型的变量超上限127时
A. 128 = 127 + 1
= 0111 1111(补)+ 0000 0001(补)
= 1000 0000(补)
= -128
B. 129 = 127 + 2
= 0111 1111(补)+ 0000 0010(补)
= 1000 0001(补)
= -127
(2)当 byte 类型的变量超过下限-128时
A. -129 = -128 – 1
= 1000 0000(补) – 0000 0001(补)
= 0111 1111(补)
= 127
B. -130 = -128 – 2
= 1000 0000(补) – 0000 0010(补)
= 0111 1110(补)
= 126
4 – 关于补码溢出的问题,可用一张图来描述(以 8 bit 为例)