目前为止,我并没有找到C++中数学意义上的取模操作。%是一种取余运算。
假设r = a mod b
,关于取模与取余的一点概念有:
-
公式都是:
c = a / b
,r = a - c * b
-
对于
a / b >= 0
的结果,取模和取余等价 -
如果
a / b < 0
,那么对于取模,c向负无穷舍入;对于取余,c向0舍入
那么,C++中什么时候会用到取模?
在类型转换时,当把一个超出范围的值v赋给一个无符号类型时,其计算方法是:
-
先确定无符号类型的可取数n
-
最终结果 = v mod n
比如,把-1赋值给unsigned char时,计算公式是:-1 mod 256
,结果是255。
而如果把-1赋值给unsigned int时,结果则是4294967295。今天出了一个bug,原因就是错误地把负数强制转换成了unsigned int,本应该转换成unsigned char,但二者的结果大不相同。