反码与补码

什么是原码:十进制数据的二进制表现形式,最左边是符号位,0为正,1为负;类如56转成二进制0011100这就是原码,第一位符号位+,一个0或1单位是bit叫做比特位,八个bit分为一组叫一字节,一个原码中的最大值第一位0其他位是七个1——>+127;最小值符号位1表示负数,后面七个1——>-127。对原码正数进行计算没有问题,右边加一,原码的弊端:如果是负数进行计算,结果就出错,实际运算的结果,跟我们预期的结果是相反的,比如5+2:

0 0 0 0 0 1 0 1
+ 0 0 1 0
0 0 0 0 0 1 1 1

这就得到结果,结果正确无误;

反码:正数的反码是其本身,负数的反码是符号位保持不变,其余位取反;为了解决原码不能计算负数的问题而出现的,计算规则:正数的反码不变,负数的反码在原码的基础上,符号位不变,数值取反,0变1.1变0.

我们拿 -56 这个数字来举例,它的原码是 1 0 1 1 1 0 0 0 ,减一之后,就会变成 1 0 1 1 0 1 1 1 ,这个数转成十进制就是-55。计算前是-56,减一之后正确的结果应该是-57(1 0 1 1 1 0 0 1)才对,居然还越减越大了,看下面:

1 0 1 1 1 0 0 0
- 1
1 0 1 1 0 1 1 1

为了解决原码不能用于计算负数的这种问题,这时候,反码它出现了,作为负数的“计算的救星”。 反码的存在是为了正确计算负数,因为原码不能用于计算负数,

十进制数字 原码 反码
+0 0000 0000 0000 0000
-0 1000 0000 1111 1111
-1 1000 0001 1111 1110
-2 1000 0010 1111 1101
-3 1000 0011 1111 1100
-4 1000 0100 1111 1011
-5 1000 0101 1111 1010
-6 1000 0110 1111 1001
-7 1000 0111 1111 1000

这时候,我们再来使用反码计算一下 -56 - 1 的结果

-56 的原码是 1 0 1 1 1 0 0 0 ,如果转成反码(符号位不变,其他位取反),

那么它的反码就是 1 0 0 0 1 1 1

1 1 0 0 0 1 1 1
- 1
1 1 0 0 0 1 1 0

结果:-56 -1 = -57,-57的原码是 1 0 1 1 1 0 0 1,转成反码刚好是1 1 0 0 0 1 1 0,刚好等于刚才我们算出的值。

跨零计算:

不过反码也有它的“软肋”,如果是负数跨零进行计算的话,计算得出的结果不对

我们拿-3 + 5来举例

-3 的原码是 1 0 0 0 0 0 1 1,转成反码的话就是1 1 1 1 1 1 0 0

1 1 1 1 1 1 0 0
+ 0 1 0 1
0 0 0 0 0 0 0 1

把计算结果转成十进制就是126,这结果显然不对。那么我们该怎么计算呢,这时候补码就出现了,作为反码的补充编码

什么是补码:正数的补码是其本身,负数的补码是在其反码的基础上+1;

十进制数字 原码 反码 补码
+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
-4 1000 0100 1111 1011 1111 1100
-5 1000 0101 1111 1010 1111 1011
-6 1000 0110 1111 1001 1000 0010
-7 1000 0111 1111 1000 1111 1001
… … … …
-127 1111 1111 1000 0000 1000 0001
-128 无 无 1000 000

跨零计算:

这时候,我们再来使用反码计算一下-3 + 5的结果

-3 的原码是 1 0 0 0 0 0 1 1,转成反码的话就是1 1 1 1 1 1 0 0,再转成补码就是1 1 1 1 1 1 0 1

1 1 1 1 1 1 0 1
+ 0 1 0 1
0 0 0 0 0 0 1 0

把这个结果转化为十进制正好为2,结果正确。在计算机当中都是使用补码来进行计算和存储的。补码很好的解决了反码负数不能跨零计算的弊端,并且补码还可以记录一个特殊的值-128,这个数据在1个字节下是没有原码和反码。补码的运算也适用于逻辑运算符。
posted @ 2022-09-12 11:36  xiaolllllin  阅读(411)  评论(0编辑  收藏  举报