整数除法的行为是什么?

问题描述 投票:0回答:6

例如,

int result;

result = 125/100;

result = 43/100;

结果总是分区的下限吗?定义的行为是什么?

c math c99 c89 integer-division
6个回答
236
投票

结果总是分区的下限吗?定义的行为是什么?

不完全是。它向 0 截断,而不是向下截断。

6.5.5 乘法运算符

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

以及相应的脚注:

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

当然有两点需要注意的是:

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

和:

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

[注:强调我的]


55
投票

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

来自 ANSI C 草案 (3.3.5):

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

因此,当您陷入 C89 编译器困境时,请注意负数。

一个有趣的事实是,C99 选择了向零截断,因为 FORTRAN 就是这么做的。请参阅 comp.std.c 上的此消息


40
投票

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

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

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


27
投票

当结果为负数时,C 会向 0 截断而不是向下取整 - 我在这篇文章中了解到为什么 Python 整数除法总是向下取整:为什么 Python 的整数除法向下取整


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

5
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.