int result;
result = 125/100;
或
result = 43/100;
结果将始终是部门的底线吗?定义的行为是什么?
#1 楼
结果将永远是部门的地板吗?定义的行为是什么?
是,两个操作数的整数商。
6.5.5乘法运算符
6当整数是除以/运算符的结果就是代数商,其中舍弃了任何
小数部分。88)如果商a / b是可表示的,则表达式
(a / b)* b + a%b
和相应的脚注:
88)这通常被称为“向零截断”。 >
当然要注意两点:
3通常对操作数进行算术转换。
和:
5 /运算符的结果是
第一个操作数除以第二个操作数的商; %运算符的
结果为
余数。在这两个操作中,如果第二个操作数的
值为零,则
行为是不确定的。
[注:重点是我的]
评论
...当然,除非您将负数除以正数(或v.v.),在这种情况下将是上限。
– A
10年8月30日在17:45
它既不是地板也不是天花板,它是小数部分的截断,在概念上是不同的!
– lornova
10年8月30日在17:48
@Will A:否。它被定义为向零截断。调用其他任何东西只会增加混乱,因此请不要这样做。
–马丁·约克
2010年8月30日在17:49
至少从数学角度来看,截断为零等同于“如果> 0,则将其他上限降低”。我认为仅将其称为截断要比将其称为下限/上限更简单,但两者均有效。无论如何,威尔A的观点是正确的:Dirkgently的答案在某种程度上是不正确的,因为他表示OP对结果是部门底线是正确的。
–布赖恩
2010年8月30日在18:17
@Philip Potter:我认为它不是在C89中定义的,也不是在1998 C ++标准中。在这些条件下,当然必须满足(a / b)* b + a%b == a,并且%b的绝对值必须小于a,但是a%b是否为负a或a为负。未指定b。
– David Thornley
10年8月30日在21:28
#2 楼
Dirkgently很好地描述了C99中的整数除法,但是您也应该知道,在C89中,带有负操作数的整数除法具有实现定义的方向。来自ANSI C草案(3.3.5):
如果任一操作数为负,则/运算符的结果是否为小于的最大整数代数商或大于代数商的最小整数是实现定义的,%运算符的结果的符号也是实现定义的。如果商a / b是可表示的,则表达式(a / b)* b + a%b等于a。
因此,当您被a困住时要小心负数C89编译器。
一个有趣的事实是C99选择了向0截断,因为FORTRAN就是这样做的。请参阅comp.std.c上的此消息。
评论
截断是最常见的CPU硬件(例如x86)的行为方式,因此做出不同的选择会很疯狂。首先出现的IDK是Fortran语义或硬件性能,但是它们相同也不是巧合。
– Peter Cordes
17年7月7日在4:23
@PeterCordes:大多数常见的CPU硬件执行大多数常量的底除运算要比截断法快。恕我直言,标准最好说,当expr1的两个实例以相同的方式组合相同的对象时,expr1 / expr2和expr1%expr2必须彼此一致,对于expr2,同样如此,但是选择截断相对于底数划分未指定。那将允许更有效的代码生成而不会破坏太多的兼容性(如果倾斜的话,实现可以记录特定的行为)
–超级猫
18年6月30日在20:05
#3 楼
在结果为负数的情况下,C会截断为0而不是下限-我了解到以下内容,为什么Python整数除法总是在这里下限:为什么Python的整数除法下限评论
我同意这样的评论,怀疑(负pos)变负是否有用?在相关说明中,我想知道在“ unsignedvar> signedvar”的某些情况下所需的算术错误行为是否有用吗?我可以理解不要求总是正确行为的理由;我认为没有要求犯错误行为的理由。
–超级猫
2010年8月30日在18:34
+1可以很好地说明为什么地板是整数除法的正确行为(与C的定义相反,C的定义是无效的,几乎不再有用)。
–R .. GitHub停止帮助ICE
10年8月30日在19:19
@supercat考虑:过滤=(k-1)*过滤+值+进位;进位=过滤的%因子;过滤的/ =因数,并通过更改值的值进行迭代。它可以很好地近似于具有时间常数k的一阶低通滤波器的整数...但是,只有当除法被截断并且进位取负值时,它才是对称的。这两种划分行为有时会派上用场。
–霍布斯
17年12月21日在15:01
@hobbs:我不认为上面的代码在信号过零时不会表现得很好。如果div是一个底数除法运算符,并且因子为奇数,则对于所有INT_MAX-(因子div 2)值,已过滤+ =(filter +(factor div 2))div因子都会产生干净且对称的行为。
–超级猫
17年12月21日在18:35
@supercat它确实可以工作;该代码只是从我已经在原子钟控制器中运行了一段时间的内容中稍微提取出来的。
–霍布斯
18年1月16日在22:11
#4 楼
是的,结果总是被截断为零。它将朝着最小的绝对值四舍五入。-5 / 2 = -2
5 / 2 = 2
对于无符号和非负符号值,这与下限相同(四舍五入为-Infinity)。
评论
截断,而不是地板。
– dan04
10年8月30日在17:44
@ dan04:yep floor仅对正整数有效:)
–狮子座
10年8月30日在17:46
#5 楼
结果将永远是部门的底线吗?
否。结果会有所不同,但仅对负值才会发生变化。
定义的行为是什么?无穷大,而整数除法四舍五入为零(截断)
对于正值,它们是相同的
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
#6 楼
我知道人们已经回答了您的问题,但是用通俗易懂的话来说:5 / 2 = 2
//由于5和2都是整数,并且整数除法总是截断小数5.0 / 2 or 5 / 2.0 or 5.0 /2.0 = 2.5
//这里5或2或两者都有小数,因此您将得到的商将是小数。
评论
摘要:有符号整数除法将截断为零。对于非负结果,此值与下限相同(朝-Infinity取整)。 (请注意,C89不能保证这一点,请参见答案。)每个人都在说“截断为零”,“上限”或“下限”,就像代码正在仔细决定使用哪种技术一样。如果代码可以讲,它会说“我只是将水坝部分扔进垃圾桶,然后继续生活”
@ TimothyL.J.Stewart“代码”正在刻意做出决定。根据规范,整数除法是指T(runcation)-除法。因此,与其他语言(例如Python或Ruby)相比,模/余数运算符的使用方式有所不同。请参阅此以获取语言执行模运算符的不同方式的列表,并且本文列出了编程语言决定执行div / modulo的至少五种常用方法。
@ 13steinj我的评论是用口语表达的,它变成了“它被截断为零...不,它是最低限度...如果它的负数是最高限度,...”有时技术不会随着人类的记忆传播到未来就像我们希望的那样,但是凭直觉知道“小部分被扔掉”,您可以得出技术要点。技术性是沉重的负担,但直觉却随风而来,让人耳目一新,我将带走这些东西,而在必要时,我将知道从哪里开始。就像您链接的那篇论文一样,谢谢。
我在这里重点回答了欧几里得除法(整数除法和模运算符之间的相互作用)。