原码 反码 补码 概念 原理 详解

参考:https://www.cnblogs.com/baiqiantao/p/7442907.html

讲的很清楚,吸收到的知识点:

  1. 机器使用补码,可以将符号位和数值位统一处理,同时,将减法转化为加法来计算;
  2. 使用补码不仅仅修复了0的符号以及存在两个编码的问题,而且还能够多表示一个最低数,这就是为什么8位二进制使用原码或反码表示的范围为 [-127, +127],而使用补码表示的范围为 [-128, 127] 的原因。
  3.  [1000_0000] 就代表-128。
    注意,-128并没有原码和反码表示。
  4.  

     补码运算使用的是“同余”的规律——两个整数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
原文地址:https://www.cnblogs.com/tingtingzhou/p/10734504.html