来自《C++ Primer》 P33页的疑问
“当我们赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数”
定义
给定一个正整数p,任意一个整数n,一定存在等式 :
n = k * p + r ;
其中 k、r 是整数,且 0 ≤ r < p,则称 k 为 n 除以 p 的商,r 为 n 除以 p 的余数。
对于整型数a,b来说,取模运算或者取余运算的方法都是:
1.求 整数商: c = a / b;
2.计算模或者余数: r = a - c * b.
取模运算和取余运算在第一步不同: 取余运算在取c的值时,向0 方向舍入(fix()函数); 取模运算在计算c的值时,向无穷小方向舍入(floor()函数)。
因此,当a和b符号一致时,取模运算和取余运算所得的c的值一致,因此结果一致。但是当符号不一致的时候,结果不一样。
当时对向无穷小方向舍入实在不理解,最后这么理解的
注意到0 ≤ r < p,即r为一个正数,那么如果定义中 n=-5.1 p=2时,那k和r应该是多少呢? 定义中r是个正数,那么显然可以写为 -5.1 = -3*2 + 0.9
而向无穷小方向舍入意思为 -2.1 舍入后 k为-3 ; -5.9 舍入后 k为 -6
所以 -5.1/2 舍入后k为-3 , 然后r=-5.1-(-3)*2=0.9
那么回到《C++ Primer》 P33页的疑问
k= -1/256=-1
r=-1-(-1)*256=255
我是最后看到r定义为正数,又想到 -1/256计算器算一下不就是等于-0.00390625
那不就是-0.00390625 = -1+ r 吗 r为正数,所以限制了前面要为-1(即对向无穷小方向舍入) 。