1.取模和取余

Ref: https://baike.baidu.com/item/%E5%8F%96%E6%A8%A1%E8%BF%90%E7%AE%97/10739384

对于整型数 a,b 来说,取模运算或者求余运算的方法都是:

  1. 求整数商: c = [a/b];
  2. 计算模或者余数: r = a - c*b.

求模运算和求余运算在第一步不同:

  • 取余运算在取 c 的值时,向 0 方向舍入 (fix () 函数);
  • 而取模运算在计算 c 的值时,向负无穷方向舍入 (floor () 函数)。

    例 1. -7 Mod 4

    那么:a = -7;b = 4;
    第一步:求整数商 c:
    ①进行求模运算 c = [a/b] = -7 / 4 = -2(向负无穷方向舍入),
    ②进行求余运算 c = [a/b] = -7 / 4 = -1(向 0 方向舍入);
    第二步:计算模和余数的公式相同,但因 c 的值不同,
    ①求模时:r = a - cb =-7 - (-2)4 = 1,
    ②求余时:r = a - cb = -7 - (-1)4 =-3。

例 2. 7 Mod 4

那么:a = 7;b = 4
第一步:求整数商 c:
①进行求模运算 c = [a/b] = 7 / 4 = 1
②进行求余运算 c = [a/b] = 7 / 4 = 1
第二步:计算模和余数的公式相同
①求模时:r = a - cb =7 - (1)4 = 3,
②求余时:r = a - cb = 7 - (1)4 =3。
归纳:当 a 和 b 正负号一致时,求模运算和求余运算所得的 c 的值一致,因此结果一致。
当正负号不一致时,结果不一样

2.反码、补码

补码

补码是一种用二进制表示有符号数的方法。正数和 0 的补码就是该数字本身。负数的补码则是将其对应正数按位取反再加 1。补码系统的最大优点是可以在加法或减法处理中,不需因为数字的正负而使用不同的计算方式。

只要一种加法电路就可以处理各种有符号数加法,而且减法可以用一个数加上另一个数的补码来表示,因此只要有加法电路和补码电路即可以完成各种有符号数加法和减法,在电路设计上相当方便。
image.png
既然说补码可以解决反码在运算中遇到的问题,我们继续以 6 + (-3) 为例来验证一下这个结论。

十进制 原码 反码 补码
6 0000 0110 0000 0110 0000 0110
-3 1000 0011 1111 1100 1111 1101