原码 反码 补码 概念 原理 详解
参考:https://www.cnblogs.com/baiqiantao/p/7442907.html
讲的很清楚,吸收到的知识点:
-
机器使用补码,可以将符号位和数值位统一处理,同时,将减法转化为加法来计算;
-
使用补码不仅仅修复了0的符号以及存在两个编码的问题,而且还能够多表示一个最低数,这就是为什么8位二进制使用原码或反码表示的范围为 [-127, +127],而使用补码表示的范围为 [-128, 127] 的原因。
-
[1000_0000]补 就代表-128。注意,-128并没有原码和反码表示。
-
补码运算使用的是“同余”的规律——两个整数a、b,若它们除以整数m所得的余数相等,则称a,b对于模m同余
解惑
疑问
一下是博客中的原文,标红的地方我一直不明白,后来发现博客上面有 负数取模的计算 公式
接下来回到二进制的问题上,看一下:2-1=1的问题。
2-1=2+(-1) = [0000 0010]原 + [1000 0001]原= [0000 0010]反 + [1111 1110]反
先到这一步,-1的反码表示是1111 1110,如果这里将[1111 1110]认为是原码,则[1111 1110]原 = -126,这里将符号位除去,即认为是126。发现有如下规律:
(-1) mod 127 = 126 (看下面解答) 126 mod 127 = 126
即:
(-1) ≡ 126 (mod 127) 2-1 ≡ 2+126 (mod 127)
2-1 与 2+126的余数结果是相同的!而这个余数,正式我们的期望的计算结果:2-1=1
解惑:利用 负数取模的计算 公式
负数取模的计算
正数进行mod运算是很简单的,但是负数呢?下面是关于mod运算的数学定义:上面是截图,下面是使用"["和"]"替换上图的"取下界"符号:
x mod y = x - y [ x / y ]
上面公式的意思是:x mod y 等于 x 减去 y 乘上 x与y的商的下界以 -3 mod 2 举例:
-3 mod 2 = -3 - 2*[-3/2] = -3 - 2*[-1.5] = -3 - 2*(-2) = -3 + 2 = 1
所以:(上面不懂的地方,就清楚了)
(-1) mod 127
= -1 - 127*[-1/127]
= -1 - 127*[-0.0078...]
= -1 - 127*(-1)
= -1 + 127
= 126