原码、反码、补码的用法和理解
基本记忆
- 原码符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值
- 正数原码、反码、补码都是一样,不变的。
- 负数的反码是原码除符号位,按位取反。
- 负数的补码等于他的原码自低位向高位,尾数的第一个‘1’及其右边的‘0’保持不变,左边的各位按位取反,符号位不变(其实就是反码加1)。
- 计算机数据以补码形式储存。
Why
原码、反码为什么不行?
计算机为了效率使用加法代替减法:
1-1 = 1+(-1)
当使用原码进行计算时:
1-1 = 1+(-1) = [0001]原+[1001]原 = [1010]原 = -2
所以对计算机而言,原码无法解决减法,此时引入反码进行计算:
计算5-3==2
十进制 二进制原码 二进制反码
5 0101 0101
+ -3 1011 1100
---------------------------------
2 0010 0010
此时值超过4bit,所以最高的1需要丢弃,丢弃后需要在最低位+1
计算1-1==0
十进制 二进制原码 二进制反码
1 0001 0001
+ -1 1001 1110
---------------------------------
0 1000 1111
得到1111(反码)==1000(原码)==-0,-0?通过反码计算会出现+0(0000)和-0(1000),一个0对应了两个码,
所以使用反码会存在俩个问题:
- 当计算结果溢出时需要额外进行+1操作,使得运算多了一步,效率降低。
- 0存在+0和-0两种存在方式,不方便理解。
模、互补、同余
概念
对于一个时钟,当你在8点时,你把时针往前拨2小时和往后拨10小时,最后时针都会停在6点。为什么?因为对时钟上时针而言,12小时即为一个模,2和10即是互为补数。
- 模:一个轮回或者说一个范围,如时钟的一圈十二小时。
- 互补: 一个数值针对某个模的互补值就是这个数值加上或者减去多少能够等于模,或者等于模的同余值。
- 同余:对于一个模而言余数相同的数。
作用(6-4为例)
(被减数-减数)%模=被减数+(模-减数)%模
比如以8为模:
(6-4)%8 = 6+(8-4)%8 = 2
所以可以得出结论:使用互补值计算出的结果与实际值其实是同余的关系。
因为对于计算机中位数固定时,多余高位省略即相当于自动取模。如在固定4bit里:
10010 = 0010 = 2
所以我们可以得到一个公式:
X-Y = X+(M-Y) = X+[(M-1)-Y+1] = X+[(M-1-Y)+1]
对于M-1-Y可以理解为:
十进制 二进制
M-1 7 1111
-Y 4 1100
0011
--------------------
M-1换算成二进制就是N位1,N位1减去任何一个N位的二进制就是按位取反!
+1 1 0001
0100
所以,通过以上演示可以认识到:
反码:(M-1-Y)
补码:[(M-1-Y)+1]
所以对于X-Y就能理解为X+Y(补码)
6-4 = 6+(8-4) = 2
--------------------
十进制 原码 反码 补码
6 0110 0110 0110
-4 1100 1011 1100
2 0010 0010 0010
注意计算后的数也是补码,如果是负数还需要转回原码。