原码、反码和补码

发布时间 2023-04-12 21:52:45作者: 挖洞404

1、机器数和真值
一个数在计算机中的二进制表示形式,叫做这个数的机器数,而这个数即为该机器数的真值。
机器数是有符号的,最高位为0表示正数,为1表示负数。

2、原码
最高位为符号位,0表示正数,1表示负数。
其余位为真值的绝对值。
一个字节的空间通过原码可以表达[-127,127],分别为1111 1111和0111 1111,并且0有两种表达方法0000 0000和1000 0000

2、反码
在原码的基础上,正数表达不变,负数的符号位不变,其余位按位取反。
一个字节的空间通过反码可以表达[-127,127],分别为1000 0000和0111 1111,并且0有两种表达方法0000 0000和1111 1111

3、补码
在反码的基础上,正数表达不变,负数的反码+1
一个字节的空间通过补码可以表达[-128, 127],分别为1000 0000和0111 1111,0只有一种表达方法0000 0000

+0 = [0000 0000]原码 = [0000 0000]反码 = [0000 0000]补码
-0 = [1000 0000]原码 = [1111 1111]反码 = [0000 0000]补码
-1 = [1000 0001]原码 = [1111 1110]反码 = [1111 1111]补码
-2 = [1000 0010]原码 = [1111 1101]反码 = [1111 1110]补码
-3 = [1000 0011]原码 = [1111 1100]反码 = [1111 1101]补码
-127 = [1111 1111]原码 = [1000 0000]反码 = [1000 0001]补码
-128 = [...]原码 = [...]反码 = [1000 0000]补码

4、补码的意义
在计算机中,实际应用的一般是补码,比如java的整数类型明确是补码机制。作用是方便正负数直接计算,比如:
-3+5=[1111 1101]补码与[0000 0101]补码,直接按位相加,进位计算可得0000 0010,即为2