例如,

int result;

result = 125/100;

or

result = 43/100;

结果会永远是分区的地板吗?定义的行为是什么?


当前回答

我知道人们已经回答了你的问题,但用门外汉的话来说:

5 / 2 = 2 //,因为5和2都是整数,整数除法总是截断小数

5.0 /2或5 /2.0或5.0 /2.0 = 2.5 //这里5或2或两者都有小数,因此你得到的商将是小数。

其他回答

是的,结果总是被截断为零。它会四舍五入到最小的绝对值。

-5 / 2 = -2
 5 / 2 =  2

对于无符号和非负符号值,这与floor(舍入到-∞)相同。

当结果为负时,C截断为0而不是floor -我在阅读关于为什么Python整数除法总是在这里floor的文章时了解到:为什么Python的整数除法是floors

Dirkgently给出了C99中整数除法的出色描述,但您也应该知道,在C89中,带负操作数的整数除法有一个实现定义的方向。

来自ANSI C草案(3.3.5):

如果任意一个操作数为负,则/操作符的结果是小于代数商的最大整数还是大于代数商的最小整数是由实现定义的,%操作符的结果的符号也是如此。如果商a/b是可表示的,则表达式(a/b)*b + a%b等于a。

因此,当您使用C89编译器时,要小心负数。

一个有趣的事实是,C99选择截断为零,因为FORTRAN就是这样做的。请在comp.std.c.上查看此消息。

我知道人们已经回答了你的问题,但用门外汉的话来说:

5 / 2 = 2 //,因为5和2都是整数,整数除法总是截断小数

5.0 /2或5 /2.0或5.0 /2.0 = 2.5 //这里5或2或两者都有小数,因此你得到的商将是小数。

结果会永远是分区的地板吗?

不。结果会变化,但变化只发生在负值上。

定义的行为是什么?

为了使它更清楚,舍去小数趋近于负无穷,而整数除法趋近于零(截断)

对于正值,它们是一样的

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