你首先要知道:补码,它就是补码,与原码反码无关。

你如果从“原码反码符号位”这条路来认识补码,就不能理解补码的意义。

补码的由来,源于日常所见的“补数”。

时针,转一圈的周期,是 12,倒拨 3 小时,可以用正拨 9 代替。

分针,转一圈的周期,是 60,倒拨 X,可以用正拨(60-X) 代替。

小孩子,只认识两位数:0~99,他的计数周期就是 10^2 = 一百。

那么,-1,他就可以用 +99 代替:

25 - 1 = 24

25 + 99 = (一百) 24

舍弃进位,只取两位,加、减两种运算,功能完全相同。

上过中学,都知道,三角函数的周期是 2π ( 即 360° )。

那么,对于-90°,你也可以用 +270° 来求函数值。

从以上的日常知识可知:负数,可以用一个对应的补数(正数)代替。

它们之间的计算公式: 补数 = 周期 + 该负数。

有了补数,负数就可以改用正数来计算,加法,也就取代了减法。

在计算机中,借助于“补数”,就可以达到简化硬件的目的。

-1 的补码,就是 256-1 = 255 = 1111 1111。
-2 的补码,就是 256-2 = 254 = 1111 1110。
-128 的补码,就是 128 = 1000 0000。

(-128 没有原码和反码,用“取反加一”求补码,无从下手!)

求负数的补码,通用的公式,还是: 补码 = 周期 + 该负数。

计算机专业的专家,不懂什么是“周期”,就另外起名叫做“模”。

n 位二进制数的模,就是 2^n。其二进制,就是 1 后面有 n 个 0。

那么,某负数的 n 位二进制的补码,公式就是:2^n + 负数。
同理,( n + 1 ) 位二进制的补码,公式就是:2^(n+1) + 负数。

 FFFFFFDFH 的绝对值的补码是多少呢 ? 先给出答案,它是:
 00000021H 大家有没有发现上下相加正好为
100000000H    

所以 : 总结如下

原理1:

对于以n位2进制数表示的负数及其绝对值,分别以补码形式表示后,补码之和等于2的n次方。

原理对应的用途

若 由负数补码(机器数) 推 原码 , 直接根据原码写结果 , 只需保证 结果 和 原码相加 每一位都为 0, 这时候得出的结果 是其绝对值 的 原码 ,真正的原码 , 是需要 把 原码的符号 换为1.(在 十六进制中特别快)
举个栗子:

 FFFFFFDFH 是一个机器数,他的真值是多少呢 ? 先给出答案,它是:
 00000021H 大家有没有发现上下相加正好为   
100000000H    
结果为33,加个负号为真值为-33

原理2:

某负数的 n 位二进制的补码,公式就是:2^n + 负数。

原理对应的用途

若 由负数原码推补码 ,直接加上 2 ^N (N为该数占的总位数),直接写答案就行。比如 -6的补码(用十六位表示) = 65530, -1的补码(用八位表示) = 255 , 直接把得出的结果 ,转化为无符号数就为 负数的补码