目录

原码、反码和补码

原码、反码和补码

我们以八位的二进制示例

机器数和真值

一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为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],因为第一位表示的是符号位,而使用补码表示时又可以多保存一个最小值。

参考链接