整数除法的行为是什么?
例如,
int result; result = 125/100;
要么
result = 43/100;
结果总会是师的底线吗? 什么是定义的行为?
结果总会是师的底线吗? 什么是定义的行为?
是的,两个操作数的整数商。
6.5.5乘法运算符
6当整数分开时,/运算符的结果是舍弃任何小数部分的代数商。 88)如果商a / b可表示,则expression式(a / b)* b + a%b应等于a。
和相应的脚注:
88)这通常被称为“向零截断”。
当然要注意两点:
3通常的算术转换是在操作数上执行的。
和:
5 /运算符的结果是第一个操作数除以第二个操作数的商; %运算符的结果是余数。 在这两个操作中,如果第二个操作数的值为零,则行为是未定义的。
[注:强调我的]
Dirkgently给出了 C99中整数除法的一个很好的描述 ,但是你也应该知道在C89整数除负操作数有一个实现定义的方向。
从ANSI C草案(3.3.5):
如果任一操作数是负数,那么/运算符的结果是小于代数商的最大整数还是大于代数商的最小整数是实现定义的,就像%运算符的结果的符号一样。 如果商a / b是可表示的,则expression式(a / b)* b + a%b将等于a。
所以当你用C89编译器时,注意负数。
C99select截断为零是一个有趣的事实,因为这是FORTRAN如何做到的。 在comp.std.c上查看此消息 。
如果结果是否定的,C截断为0而不是地板 – 我学到了这个关于为什么Python整数部分总是在这里的读法: 为什么Python的整数部分地板
是的,结果总是被截断为零。 它将向最小的绝对值圆整。
-5 / 2 = -2 5 / 2 = 2
对于无符号和非负符号值,这与floor(向-Infinity四舍五入)相同。
结果总会是师的底线吗?
结果不一样,但变化只发生在负值上。
什么是定义的行为?
为了清楚地向负无穷的地方回合,而整数除法舍入到零(截断)
对于正面的价值观,他们是一样的
int integerDivisionResultPositive= 125/100;//= 1 double flooringResultPositive= floor(125.0/100.0);//=1.0
对于负值,这是不同的
int integerDivisionResultNegative= -125/100;//=-1 double flooringResultNegative= floor(-125.0/100.0);//=-2.0