假设分母<>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,自从我使用这个词以来已经有一分钟了。
顺便说一句 <>
应该是 !=
@pmg <>
传统上表示大于/小于;对于数字,它只是!=
的另一种拼写。我更多地将它用于理论目的,而不是表示 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,整数除法是不是会溢出/下溢? [复制]的主要内容,如果未能解决你的问题,请参考以下文章