取模后的余数,向负无穷方向舍入

来自《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(即对向无穷小方向舍入) 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值