- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在网站上看到了多个解决无符号整数上溢/下溢的问题。大多数关于underflow 的问题都询问有关将负数分配给无符号整数的问题;我不清楚的是,当一个 unsigned int
从另一个 unsigned int
中减去时会发生什么,例如a - b
结果是否定的。标准的相关部分是:
A computation involving unsigned operands can never overflow, because a result that cannot be represented by the resulting unsigned integer type is reduced modulo the number that is one greater than the largest value that can be represented by the resulting type.
在这种情况下,您如何解释“减少”?这是否意味着 UINT_MAX+1
被添加 到否定结果,直到 >= 0
?
我看到 this question 解决了要点(基本上说标准选择谈论溢出但关于模的要点也适用于下溢)但我仍然不清楚:
假设a-b
的结果是-1
;根据标准,操作 -1%(UINT_MAX+1)
将返回 -1
(如 here 所解释);所以我们回到了起点。
这可能过于迂腐,但是这个模数是否意味着数学模数而不是 C 的计算模数?
最佳答案
首先,低于给定整数类型的最小值的结果在 C 中不称为“下溢”。术语“下溢”是为浮点类型保留的,含义完全不同。超出整数类型的范围总是溢出,无论您越过范围的哪一端。因此,在这种情况下,您没有看到语言规范谈论“下溢”这一事实并不真正意味着什么。
其次,您对“减少”一词的含义完全正确。最终值是通过从“数学”结果中添加(或减去)UINT_MAX+1
直到它返回到 unsigned int
的范围内来定义的。这也与欧几里得“模”运算相同。
关于c - C 中的无符号整数下溢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50900370/
我是一名优秀的程序员,十分优秀!