原码、反码和补码
目录
原码、反码和补码
我们以八位的二进制示例
机器数和真值
一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1。
例子:十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 ,此处 00000011 和 10000011 是机器数,+3 和 -3 是真值。
原码
使用第一位作为符号位,后面表示数值
+1 : 0000 0001 -1 : 1000 0001
所以8位二进制数的取值范围是:
[1111 1111, 0111 1111] = [-127, 127]
反码
正数的反码是其本身
负数的反码是符号位不变,其余各位取反
+1 : 0000 0001 -1 : 1111 1110
补码
正数的补码是其本身
负数的反码是符号位不变,其余各位取反,最后 +1
+1 : 0000 0001 -1 : 1111 1111
在原码和反码中,由于符号位的存在,0000 0000[+0] 和 1000 0000[-0] 存在两个 0 值
而在补码中,0000 0000 表示 0,1000 0000 表示 -128
(-1) + (-127) = [1111 1111] + [1000 0001] = [1000 0000] 即 -128
使用补码,不仅没有 0 存在两个编码的问题,还多了一个最低数。
所以在8位二进制中,使用原码或反码表示范围是[-127,+127],而使用补码表示范围是[-128,+127]。
因为机器使用补码,所以对于编程中常用到的32位int类型,可以表示范围是: [-231, 231-1],因为第一位表示的是符号位,而使用补码表示时又可以多保存一个最小值。