1. 问题

我们知道,在计算机中是用补码来存放实际的正负数的,那么计算机为什么要用补码来存放数据,计算机课本中,那个补码 = 反码 + 1的公式又是怎么来的?

要了解这些问题的答案,我们先要了解一些基本的知识,最基本的同余公式这里就不讲了,看本帖之前需要去离散数学或数论中了解下基本的同余运算即可。

 

2. 计算机的字长和同余计算

计算机的字长是指计算机运算时,能存放的最大数字的的位长,如我们常说的32位机,字长就是32位的,寄存器只有32bit,最多能放32个1,能表达的最大数字就是232 - 1

当超过这个数字后,由于无法存储,会被计算机丢弃,同时会设置CPU的溢出标志位,这就是所谓的溢出

为了简单,我们用8位机来做演示,即最大能表示的数字是28 - 1

m = 28

所以,计算机的计算 (a + b)时,实际上计算的是 (a + b) % m (mod m),超过m的部分都会被丢弃,只取余数的部分,即计算机中的计算实际都是一个模m的同余计算

如 1000 0000 + 1000 0001 = 1 0000 0001

由于最高位超出最大能够表示的数,多出的位将溢出丢弃,所以最后的结果为 0000 0001 = 1

 

3. 补码的定义和计算

设m > b >= 0,b为整数

则b的补 b = m – b (注意,这里定义的是补,而不是补码,不要弄混了)

由于有正负数,计算机中对正负数的补码进行了区分定义:

1> 正整数b的补码为自身,即b的补码仍为b

2> 负整数-b的补码为b的补,即b

我们知道,a - b即可转化为 a + (-b),如果用补码来运算

a – b = a + (-b)  (mod m) 在计算机中计算的是 a + b  (mod m)

那么他们的同余吗