以 8bit 的数举例,当我们想表示负数时,我们把无符号数中大于 2 ^ 7 - 1 的部分与前半部分一一对应,用来指代负数。前半部分是范围为 0 ~ 2 ^ 7 - 1 的非负数,假如这个一一对应关系满足
非负数+补数 = 2 ^ 8 (很显然可以做到),则
补数 = (2 ^ 8 - 1 - 非负数 ) + 1
很显然,2 ^ 8 - 1 的每一位都是 1,那么 2 ^ 8 - 1 就是对这个非负数每一位取反。
这就得到了口诀:负数补码是正数取反再+1。
所谓的补码是对2的补码是不准确的,是对 2 ^ n 的补码,本例中 n = 8。
已知补码,如何求其表示的值呢?
非负数 = (2 ^ 8 - 1) - 补数 + 1,即 对补数取反+1就是负数的绝对值,加上负号就是字面值。
其实就是减一取反,但是0减1取反而会不好理解。
逆推口诀和正推口诀是一样的,非常神奇。
举例:已知补码 11111011,求字面值。
取反得到 00000100,+1 得到 00000101,绝对值是5,因此字面值是 -5。
补码可以用加法来统一处理减法,a - b 的处理方式是 a + (-b) ,即 a + (b的补码)。