对整数a,b取余和取模统一都分为2步:
第一步:求整数商, c = a / b
第二步:计算模或余数,r = a - c * b
这里,第二步对于取余还是取模都是相同的,因为减法和乘法一般不会带来误差;但是对于第一步,除法会带来误差,取余在计算c时是向0的方向舍入的,比如-1/5=-0.2,于是向0取整得0,因此余数 r1 = -1 - 0 * 5 = -1;但是取模在计算c时是向负无穷大方向舍入的,即上面的-0.2会取整为-1,因此模 r2 = -1 - (-1) * 5 = 4;
因此,对于两个数都是正数来说,没有差别,因为0和负无穷大在小数c的同一个方向上;但是对于存在一个负数的情况下,0的方向和负无穷大在c的两个相反的方向,因此就有差别。
“当我们赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数。例如, 8比特大小的unsigned char 可以表示0 至 255 区间内的值,如果我么赋值给此类型变量一个区间以外的值,则实际的结果是该值对256取模后所得的余数。因此,把 -1 赋值为8比特大小的unsigned char 所得的结果是255"
这里实际上是可以用二进制进行排位,-1的二进制码为 11111111,而unsigned char 为无符号整型,所以首位,即符号位,为0,表示正数,然后后七位将-1的低7位1补上,即 01111111,因此为255