时间:2018-07-16
作者:魏文应
一、正数和负数的表示方法
我们知道,正数和它的相反数相加时,会等于0,比如 1 + (-1) = 0
, 33 + (-33) = 0
。使用二进制,我们可以暂时规定,最高位是0 表示是正数, 最高位是1 表示负数:
二、为什么需要补码?
我们有下面假设:
我们用
0000 1111
表示+7
正数7,用1000 1111
表示-7
负数 -7,那么相加的结果就是1001 1110
。我们用
0000 0001
表示+1
,用1000 0001
表示-1
,相加结果是1000 0010
。
上面两个例子, 7 + (-7) = 0 = 1001 1110
、1 + (-1) = 0 = 1000 0010
。我们发现,同样表示0,二进制的结果不一样。这当然不是我们想要的,我们希望二进制相加的0的结果一直是 0000 0000
。下面我们换个思路来表示数值:
正数保持不变,
0000 1111
依然表示+7
。-
找一个数和
0000 1111
相加,使其结果为0000 000
。这个数计算如下:0000 1111 + 1111 0000 + 1 = (1) 0000 0000
计算结果为
1 0000 0000
,我们把第九位直接丢弃,结果就是我们想要的0000 0000
。 观察发现,只要在正数的基础上,取反并加1,就能使得 这个正数 和 取反并加1 相加的结果为
0000 0000
。也就说,正数 取反并加1 这个正数对应的相反数。比如:正数1 可以通过这种方式,求得正数 -1的二进制反码写法。上面
1111 0000 + 1
就是我们要求的 补码 了。
把 0111 0000
取反就是 1000 1111
,把 0011 0000
取反就是 1100 1111
,我们发现,都会有一个 独一无二 的反码和原码对应。也就意味着补码也是独一无二的:
从
0000 0001
到0111 1111
,就是1 ~ 127
。从
1111 1110 + 1
到1000 0000 + 1
,就是-1 ~ -127
。0000 0000
表示0
。这时发现1000 0000
还没有用,怎么办?思来想去,最后设计芯片逻辑运算的那帮家伙说:“算了,用它来表示-128
吧!!!” 也正是这个原因,导致有了 -128 没有反码 这种说法的产生。