C语言取模运算符特殊情况:(a%b + b)%b与a%b是否等价?
C语言中
(a%b + b) % b与a%b的差异 两者并不完全等价,核心差异来自C语言取模运算符%的符号规则,下面具体拆解:
C语言%运算符的原生行为
C标准明确规定:a % b的结果符号与被除数a保持一致,余数的绝对值满足 |a%b| < |b|。举几个典型例子:
- 正被除数:
5 % 3 = 2,5 % (-3) = 2 - 负被除数:
(-5) % 3 = -2,(-5) % (-3) = -2
(a%b + b) % b的作用
这个表达式的目的是强制让余数的符号与除数b保持一致,最终得到一个范围在[0, b-1](当b为正)或[b+1, 0](当b为负)的结果,避免原生取模出现负余数的情况。
差异场景对比
直接看不同符号组合下的结果差异:
- 场景1:a正、b正
a%b→5%3=2(a%b + b)%b→(2+3)%3=2
结果一致 - 场景2:a负、b正
a%b→(-5)%3=-2(a%b + b)%b→(-2+3)%3=1
结果完全不同,后者得到了符合直觉的正余数 - 场景3:a正、b负
a%b→5%(-3)=2(a%b + b)%b→(2-3)%(-3)=-1
结果不同,后者将余数调整为与b同符号的值 - 场景4:a负、b负
a%b→(-5)%(-3)=-2(a%b + b)%b→(-2-3)%(-3)=-2
结果一致
总结
只有当a和b同号,或者a为正数且b为负数时,两个表达式结果才可能一致;当a为负数、b为正数时,结果必然不同——这也是你当初写(a%b + b) % b的核心原因:解决负被除数取模得到负余数的问题,确保余数为非负值。
内容的提问来源于stack exchange,提问作者defleppard
相关产品推荐
相关产品推荐

