原码 反码 补码
跳到导航
跳到搜索
原码、反码和补码是计算机中对数字的二进制表示方法。
- 原码:最高位为符号位,0 表示正数,1 表示负数,其余位表示数值的绝对值
- 补码:正数的补码与原码相同,负数的补码为在反码的基础上加 1(其中 -8 表达为 1000,符号位为负)
- 反码:正数的反码与原码相同,负数的反码为在原码的基础上,符号位不变,其余位取反
定义
下面以 n=4 bit 为例:
原码
- 正数范围:[ 0 ~ 7] - (0000 - 0111),8 个数字
- 负数范围:[-0 ~ -7] - (1000 - 1111)
很明显,只能表达 15 个数字,其中 0 有两个(0,-0)。
补码
- 正数范围:同原码
- 负数范围:[-1 ~ -8] - (1111 - 1000)
-1 {原码:(1001) -> 反码(1110) -> 补码(1111)}
-8 {定义补码为(1000)}
可以表达 16 个数字,-8 ~ -1,0 ~ 7。
P.S. 因为补码负数是在反码的其中上加 1,所以极值的表达与正数有些许不同: 正数:[ 7] 2n-1-1 负数:[-8] -2n
计算
计算机是以补码来对数字进行表达,好处是不用复杂的计算逻辑,只需要做取反(异或)、加法就可以了。如:
- 5 + 2
= (0101) + (0010)
= (0111)
= 7 - 5 - 2
5 + (-2)
=(0101) + (1110)
= (0011)
= 3
溢出
补码运算,符号位相同,出现进位即为溢出(符号位=0,为上溢出;符号位=1,为下溢出)