负数的二进制补码设计原理
大家都知道:有符号数的负数的补码是 其正数的反码+1,例如 10001111 的补码是反码01110000 加 1 =01110001 ,很多书都这么说,可是为什么这样计算的结果就是它的补码?
在某些计算机组成原理书上提到:其实补码的计算原理,是用一个模来减去无符号的正数部分。譬如时钟,12点之后是13点,但是时钟上没有13点怎么办?就用13减去12=1点。这个模是12.可惜这个比喻并不是很好。
一个字节长的无符号数的表示范围 :0~255,有符号数的表示范围:-128~127 ,
注意,这个表示范围的写法极有可能影响我们的思维,从而导致错误。我们应该这样来写:0~127 ~ -128 ~ -1
,这才是较好的写法。为什么?因为这个写法的数的顺序与0~255 一一对应。
由上,我们了解,其实补码不过是用128 ~ 255 这段范围的数来表示 ~128 ~ -1这段范围的负数。那么我们就可以凭自己,而不是看教材,就可以推测出计算补码的公式,就是:256-欲求的负数的绝对值= 此负数的补码。
如上图所示:255(1111 1111)应该用来表示 -1 。 正1的反码为 254(1111 1110) 表示的是 -2 。
因此 正1的反码(254) 再加上1 等于 255(表示-1)。
如果 255表示 -0 那么。二进制负数 = 其绝对值的反码
如果 255表示 -1 那么。二进制负数 = 其绝对值的反码+1.(把它称为补码)
同理 255如果表示 -2 那么。二进制负数 = 其绝对值的反码+2.
这样使得,最高位既能参与运算,又当做正负号使用