例如,

int result;

result = 125/100;

or

result = 43/100;

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


当前回答

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

来自ANSI C草案(3.3.5):

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

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

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

其他回答

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 =  2

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

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

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

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

不完全是。它舍入到0,而不是地板。

6.5.5乘法运算符

当整数被除法时,运算符/的结果是与any的代数商 如果商a/b是可表示的,则表达式为 (a/b)*b + a%b等于a。

以及相应的脚注:

这通常被称为“趋近于零的截断”。

当然有两点需要注意:

通常的算术转换是在操作数上进行的。

and:

操作符/的结果是 商由除法得到 第一个操作数由第二个操作数;的 操作符的结果是 余数。在这两个操作中,如果 第二个操作数的值为零, 行为是未定义的。

[注:重点是我的]