261

例如,

int result;

result = 125/100;

或者

result = 43/100;

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

4

6 回答 6

214

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

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

6.5.5 乘法运算符

6当整数被除法时,/ 运算符的结果是代数商,其中任何小数部分被丢弃。88)如果商 a/b 是可表示的,则表达式 (a/b)*b + a%b 应等于 a。

和相应的脚注:

  1. 这通常被称为“向零截断”。

当然有两点需要注意:

3对操作数执行通常的算术转换。

和:

5 / 运算符的结果是第一个操作数除以第二个的商;% 运算符的结果是余数。在这两种操作中,如果第二个操作数的值为零,则行为未定义。

[注:强调我的]

于 2010-08-30T17:44:23.500 回答
48

Dirkgently很好地描述了 C99 中的整数除法,但您还应该知道,在 C89 中,带有负操作数的整数除法具有实现定义的方向。

来自 ANSI C 草案 (3.3.5):

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

因此,当您遇到 C89 编译器时,请注意负数。

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

于 2010-08-30T23:28:06.453 回答
28

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

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

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

于 2010-08-30T17:42:55.303 回答
25

结果为负数时,C 向 0 截断而不是取整——我读到这篇文章,了解为什么 Python 整数除法总是在这里取整:Why Python's Integer Division Floors

于 2010-08-30T17:55:17.943 回答
13

结果会永远是分区的底线吗?

不会。结果会有所不同,但只有负值才会发生变化。

定义的行为是什么?

为了清楚地向负无穷大取整,而整数除法向零取整(截断)

对于正值,它们是相同的

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
于 2015-02-06T07:42:30.997 回答
4

我知道人们已经回答了你的问题,但是用外行的话:

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

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

于 2020-04-05T04:30:51.823 回答