principle · 2021-02-06 0

计算机原码、反码 、补码

一、概述

  • 真值:十进制、二进制、八进制、十六进制等用来表示实际数值的数
  • 机器数:数在计算机中的表示形式
  • 原码:正数是其二进制本身;负数是符号位为1,数值部分取X绝对值的二进制
  • 反码:正数的反码和原码相同;负数是符号位为1,其它位是原码取反
  • 补码:正数的补码和原码,反码相同;负数是符号位为1,其它位是原码取反,未位加1。(或者说负数的补码是其绝对值反码未位加1)

现代计算机中普遍使用补码表示法,而不是原码

编码 108(十进制) -108(十进制)
原码 01101100 11101100
反码 01101100 10010011
补码 01101100 10010100

二、原码

原码就是符号位和真值的绝对值组成的

[+1] = [00000001]

[-1] = [10000001]

三、反码

反码,主要用于原码和补码的相互转换,反码作为中间数过渡使用

[+1] = [00000001] = [00000001]

[-1] = [10000001] = [11111110]

四、补码

[+1] = [00000001] = [00000001] = [00000001]

[-1] = [10000001] = [11111110] = [11111111]

1.补数和模

例如,时钟指针指向6,要是它指向3,可以让指针逆时针方向走3格,也可以让指针顺时针方向走6格。

6 + (-3) = 3 和 6 + 9 =15

在数学上,称时钟的12格为,写作mod12,而称+9是-3以12为模的补数。对于模12而言,-3和+9是互为补数的。

−3 ≡ +9(mod 12)

只要确定一个模,就可以找到一个与负数等价的正数来代替该负数,而这个得到的正数,即为负数的补数。

结论一:负数的绝对值,和它的补数相加,就是模

结论二:负数和模相加,得到该负数对应的正数补数

利用补数和模,可以把减法转化为加法:

A是9,B是5,对于模12,-5的补数是7

A - B = 9 - 5 = 4

A - B = 9 + 7 = 16 = 4(mod 12)

对于二进制,有:

−1011 ≡ +0101 (mod 24
−0101 ≡ +0101 (mod 24
−0.1001 ≡ +1.0111 (mod 2)
+0.1001 ≡ +0.1001 (mod 2)

2.补码

补数的出现,可以让原本作减法的式子变成加法

负数的补数为正数,但负数的补码前的符号位依然是负符号为1,即符号位与原数保持一致

例如,A = 1110,B = 1101

A - B = [0,1110] - [0,1101] = [0,0001] (mod 24

A - B = [0,1110] + [1,0011] = [10,0001] = [0,0001] = [0,0001] (mod 24

补码运算的运算的符号位进位溢出

五、表示范围

二进制编码 无符号数 原码 反码 补码
0000 0000 0 +0 +0 +0
0000 0001 1 +1 +1 +1
0000 0010 2 +2 +2 +2
... ... ... ... ...
0111 1101 125 +125 +125 +125
0111 1110 126 +126 +126 +126
0111 1111 127 +127 +127 +127
1000 0000 128 -0 -127 -128
1000 0001 129 -1 -126 -127
1000 0010 130 -2 -125 -126
... ... ... ... ...
1111 1101 253 -125 -2 -3
1111 1110 254 -126 -1 -2
1111 1111 255 -127 -0 -1