提问人:T.T.T. 提问时间:8/31/2010 最后编辑:LundinT.T.T. 更新时间:5/27/2021 访问量:522145
整数除法的行为是什么?
What is the behavior of integer division?
答:
是的,结果总是被截断为零。它将向最小的绝对值四舍五入。
-5 / 2 = -2
5 / 2 = 2
对于无符号和非负有符号值,这与 floor 相同(向 -Infinity 舍入)。
评论
结果会永远是部门的底线吗?定义的行为是什么?
差一点。它向 0 四舍五入,而不是地板。
6.5.5 乘法运算符
6 当整数被除以时,/ 运算符的结果是代数商与任何 丢弃部分。88) 如果商 a/b 是可表示的,则表达式 (a/b)*b + a%b 等于 a。
以及相应的脚注:
- 这通常被称为“向零截断”。
当然有两点需要注意:
3 通常的算术转换是在操作数上执行的。
和:
5 / 运算符的结果是 商来自 除法 第一个操作数由第二个操作数;这 % 运算符的结果是 剩余。在这两个操作中,如果 第二个操作数的值为零, 行为未定义。
[注:强调我的]
评论
(a / b) * b + a % b == a
a % b
a
a % b
a
b
如果结果为负数,则 C 会截断为 0 而不是 flooring - 我在这里学习了关于为什么 Python 整数除法总是 floors 的读物: 为什么 Python 的整数除法 floors
评论
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)
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
结果会永远是部门的底线吗?
不。结果各不相同,但变化仅发生在负值上。
定义的行为是什么?
为了清楚起见,地板向负无穷大舍入,而整数除法向零舍入(截断)
对于正值,它们是相同的
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 或两者都有小数,因此您将得到的商将是十进制。
评论
"I just throw the dam fraction part in the trash and move on with life"