《C++回顾笔记》取模运算与取余运算

对于整型数a,b来说,取模运算和取余运算的计算方法是一样的:

  1. 求整数商:c = a/b;
  2. 取余和取模:r = a - c * b;

取模运算和取余运算的区别在于第一步对计算结果舍入的方式不同:取模运算在计算c的值时,会将结果向负无穷方向舍入,而取余运算在取c的值时,向0方向舍入

例如-1对256取模和取余时:

  1. 求整数商c,取模将结果向负无穷方向舍入得到-1,而取余则将结果向0方向舍入得到0;
  2. 将算出的整数商c代入计算r的公式,得到取模的结果为255,而取余的结果为-1;

当整数a和b的符号一致时,易知其整数商必大于或者等于0,取模运算和取余运算对其舍入后的结果也一致,所以此时取模运算和取余运算的结果是一样的。
当整数a和b的符号不一致时,易知其整数商必小于或者等于0,因此可以得到:

1
r = a + |a| * sign(b) * s

其中,sign(b)表示b的符号(b大于0时,其为1;小于0时其为-1)。而s表示舍入后整数商对原始商的变化倍数。易知对于取模运算来说,s必大于1,而对于取模运算来说,s必小于1。也就是说,当a和b的符号不一致时,求模运算结果的符号和b一致,而求余运算结果的符号和a一致

最后,需要注意的是,在不同的语言里,运算符%表示的含义不一致,有的语言认为%表示取模运算(如Python),但在C/C++里,%表示取余运算。


《C++回顾笔记》取模运算与取余运算
https://asancai.github.io/posts/ad89a9b/
作者
RainbowCyan
发布于
2021年5月18日
许可协议