整数除法的性质是什么?

例如,

int result;


result = 125/100;

result = 43/100;

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

488883 次浏览

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

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

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

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

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

6.5.5乘法运算符

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

以及相应的脚注:

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

当然有两点需要注意:

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

和:

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

.行为未定义

[注:重点是我的]

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

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

来自ANSI C草案(3.3.5):

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

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

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

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

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

定义的行为是什么?

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

对于正值,它们是一样的

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 / 2 = 2 //因为5和2都是整数,整数除法总是截断小数

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