例如,
int result;
result = 125/100;
要么
result = 43/100;
结果将永远是部门的底线吗?定义的行为是什么?
"I just throw the dam fraction part in the trash and move on with life"
例如,
int result;
result = 125/100;
要么
result = 43/100;
结果将永远是部门的底线吗?定义的行为是什么?
"I just throw the dam fraction part in the trash and move on with life"
Answers:
结果将永远是部门的底线吗?定义的行为是什么?
是的,两个操作数的整数商。
6.5.5乘法运算符
6当整数分割,/运算的结果是代数商与丢弃任何小数部分。88)如果商a / b是可表示的,则表达式(a / b)* b + a%b等于a。
以及相应的脚注:
88)这通常被称为“向零截断”。
当然要注意两点:
3在操作数上执行常规的算术转换。
和:
5 /运算符的结果是第一个操作数除以第二个的商。%运算符的结果是余数。在这两个操作中,如果第二个操作数的值为零,则行为是不确定的。
[注意:重点是我的]
(a / b) * b + a % b == a
必须满足,绝对值a % b
必须是小于a
,但无论a % b
是为负负a
或b
没有指定。
Dirkgently 很好地描述了C99中的整数除法,但是您也应该知道,在C89中,带有负操作数的整数除法具有实现定义的方向。
从ANSI C草案(3.3.5):
如果任一操作数为负,则/运算符的结果是小于代数商的最大整数,还是大于代数商的最小整数,这是实现定义的,%运算符的结果也是如此。如果商a / b是可表示的,则表达式(a / b)* b + a%b等于a。
因此,当您使用C89编译器时,请当心负数。
一个有趣的事实是,C99选择了将截断取零,因为FORTRAN就是这样做的。请参阅comp.std.c上的此消息。
reliable integer division
了新的语言功能。惊人*-*
。
expr1 / expr2
并且expr1 % expr2
必须彼此一致,expr1
对于expr2
,同样如此,但是对于截断和底数分割的选择则未指定。那将允许更高效的代码生成而不会破坏太多的兼容性(并且实现可能倾斜地记录特定行为)
在结果为负数的情况下,C会截断为0而不是下限-我了解到以下内容,为什么Python整数除法总是在此处下限:为什么Python的整数除法
filtered = (k - 1) * filtered + value + carry; carry = filtered % factor; filtered /= factor
,通过更改的值进行迭代value
。它可以很好地逼近具有时间常数的一阶低通滤波器的整数,k
但是如果除法被截断并carry
得到负值,则它只是对称的。这两种划分行为有时会派上用场。
div
是底数除法运算符且factor
为奇数,则filtered += (filter+(factor div 2)) div factor
对于直到的所有值都将产生干净且对称的行为INT_MAX-(factor div 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