计组 | 补码取反加一与补码减一取反相同的证明
做而论道_CS:
求负数 (X < 0) 的 n 位补码,公式是:
[ X ]补 = 2^n - | X | 。
---------------------
按照公式来求补码,是非常简单的事。
根本也不涉及什么:符号位原码反码取反加一。
例:-31 的八位补码是多少?
解: 2^8 - |-31 |
= 256 - 31 = 225 = 1110 0001 (二进制)
这不就求出来了嘛!
但是,有人偏要找麻烦,鼓吹什么 “取反加一” !
那就慢慢算吧。
---------------------
先看,2^n 的二进制,是多少呢?
是:111 ... 1 + 1。
(共有 n 个 1,后面再加上一个 1。)
再看,| X | 的二进制,又是多少呢?
取绝对值后,就是 n 位的正数。
可写成:| X | = 0xx ... x。
(共有 n-1 个 x 。)
其中的 x,是一位二进制数,即 0 或 1。
---------------------
所以,公式 2^n - | X | 的二进制形式,就是:
111 ... 1 + 1 - 0xx ... x 。
此公式,还可以改写为以下两种形式:
(111 ... 1 - 0xx ... x)+ 1 (1)
111 ... 1 -(0xx ... x - 1) (2)
由小学所学的知识,可知:
方程(1) 和方程(2),是等效的。
---------------------
另外:1 - 0 = 1、1 - 1 = 0。
因此:1 - x, 就是对 x 取反。
---------------------
那么,方程 (1),就是:先取反、后加一;
而,方程 (2),就是:先减一、后取反。
至此,就证明了:
取反加一、减一取反,功能是相同的。
证明这个命题,只需用到小学的知识。
根本就不用:原码反码这些乱七八糟的事!
|