整数除法的行为是什么?

时间:2010-08-30 17:41:18

标签: c math c99 c89 integer-division

例如,

int result;

result = 125/100;

result = 43/100;

结果总会成为师的最低点吗?什么是定义的行为?

6 个答案:

答案 0 :(得分:157)

  

结果总会成为师的最低点吗?什么是定义的行为?

是,两个操作数的整数商。

  

6.5.5乘法运算符

     

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

和相应的脚注:

  

88)这通常被称为“截断为零”。

当然需要注意两点:

  

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

  

5 /运算符的结果是   来自分裂的商   第一个操作数由第二个操作数;该   %运算符的结果是   剩余。 在这两个操作中,如果是   第二个操作数的值为零,   行为未定义。

[注意:强调我的]

答案 1 :(得分:37)

在C99中Dirkgently给出an excellent description整数除法,但是你也应该知道在C89中,带有负操作数的整数除法具有实现定义的方向。

从ANSI C草案(3.3.5):

  

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

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

这是一个有趣的事实,C99选择截断为零,因为这是FORTRAN做到的。请参阅comp.std.c上的this message

答案 2 :(得分:20)

如果结果是负数,则C截断为0而不是地板 - 我学习了这个解释为什么Python整数除法总是落在这里:Why Python's Integer Division Floors

答案 3 :(得分:17)

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

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

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

答案 4 :(得分:10)

  

结果总是会成为分部的底线吗?

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

  

定义的行为是什么?

使其清晰地向负无穷大舍入,而整数除法向零舍入(截断)

对于正值,它们是相同的

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 :(得分:1)

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

5 / 2 = 2 //由于5和2都是整数,并且整数除法总是截断小数位

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