假设分母<>0,整数除法是不是会溢出/下溢? [复制]

Posted

技术标签:

【中文标题】假设分母<>0,整数除法是不是会溢出/下溢? [复制]【英文标题】:Can integer division ever over/underflow, assuming the denominator <>0? [duplicate]假设分母<>0,整数除法是否会溢出/下溢? [复制] 【发布时间】:2019-11-15 17:04:19 【问题描述】:

(真)整数除法能否上溢/下溢(假设分母不为 0)?

由于值总是保持不变或变小(因为在整数除法中,最小的绝对非零分母是 1,因此结果永远不会大于分子),我假设不会。

我在 C/C++ 标准的上下文中或多或少地询问,我对各种现代 CPU 架构在定义/未定义行为方面如何以不同方式处理整数除法感兴趣。

【问题讨论】:

int nonono = INT_MIN / -1; 呵呵,很好@JimRhodes,自从我使用这个词以来已经有一分钟了。 顺便说一句 &lt;&gt; 应该是 != @pmg &lt;&gt; 传统上表示大于/小于;对于数字,它只是!= 的另一种拼写。我更多地将它用于理论目的,而不是表示 C 语法。 另见Integer division overflows。 【参考方案1】:

由于值总是保持不变或变小......

我以前也是这么想的,但是当我们这么说的时候,我们是在悄悄地假设分母是

由于分母可以是负数,因此存在一种晦涩但具有破坏性的情况:在 2 的补码算术下,INT_MIN / -1 的数学结果是一个比INT_MAX 大一的数字。

也就是说,在 16 位 2 的补码机器上,INT_MIN 是 -32768,这是可以完美表示的,但是 -32768 ÷ -1 想要是 +32768,但 INT_MAX 只是 32767。同样,在 32位,-2147483648 是可表示的,但也不能被 -1 整除。

这是 2 的补码算术的一个特殊怪癖,因为INT_MIN 的大小与INT_MAX 的大小不完全相同。另一方面,在一个补码或符号/幅度算术下,INT_MIN 正好是INT_MAX 的负数,所以没有“毁灭性案例”,据我所知,除法对所有输入都有很好的定义(嗯,当然,分母中的零除外)。

【讨论】:

hmmmm ...没有“比INT_MAX多一个”这样的东西:) @pmg 是的,但它“想成为”;) @pmg Smiley 指出,但你是对的。措辞调整。 只是为了明确一点:".. / 运算符的结果是代数商,其中任何小数部分被丢弃。105) 如果商 a/b 可表示,表达式 (a/b)*b + a%b 应该等于 a;否则,a/b 和 a%b 的行为都是未定义。" @987654321 @ @Kaz 您没有看到 pmg 评论的措辞。 (查看历史记录。)

以上是关于假设分母<>0,整数除法是不是会溢出/下溢? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

每日一题「整数除法」

每日一题「整数除法」

7. Reverse Integer(反转整数)

连续截断整数除法可以用乘法代替吗?

LeetCode第二十九题-整数除法

四则运算实现