【发布时间】:2018-10-15 15:11:30
【问题描述】:
- 对于
uint8_t、uint16_t、uint32_t、uint64_t,是否根据 C++17 定义了算术溢出?如果是,定义的行为是什么(非常感谢 C++ 标准的摘录) - 对于
int8_t、int16_t、int32_t、int64_t,是否根据 C++17 定义了算术溢出? (非常感谢 C++ 标准的摘录) - 如果以上任何一项或全部是特定于实现的,g++ 和 clang 的定义是什么?
- 如果它是特定于架构的(正如 Havenard 指出的那样),我的问题是特定于 x86(-64)。
- 如果我做更小的 unsigned int - 更大的 unsigned int,它的定义是否明确?
我看到post 的第一个答案提到我的问题 #1,它是在 C 标准中定义的,尽管他没有引用它,我在 C++ 标准中找不到任何相关内容。
==================
更新 1:
删除了每个 ach 的“下溢”,因为它是错误的术语(感谢@ach)。添加了 #5 来表达我所说的“下溢”的真正含义(不正确)
【问题讨论】:
-
什么都没有改变
unsgined整数上溢/下溢定义明确,signed没有。 -
它是特定于架构的,它不是由语言决定的。
-
关于术语的注释:不存在整数算术下溢。下溢仅适用于浮点运算。当计算结果的绝对值小于可表示的结果时,就会发生这种情况。
-
@HCSF 通常,这是溢出。但在 C/C++ 的情况下,这是常规算术;它定义明确;我自己称之为环绕,但我完全不确定这个词是否合适。
-
@HCSF 你错过了我的观点:从一般计算机科学的角度来看,这是溢出 - 算术运算产生的值无法在目标类型中表示。但是 C 和 C++ 明确定义了对无符号整数的运算是模数运算,所以溢出是不可能的。
标签: c++ x86 g++ clang language-lawyer