C 中有符号整数溢出的未定义行为
有符号整数溢出,当有符号整数的值超出其可表示范围时发生,这是很好的- 已知在 C 中是未定义的行为。然而,C 11 cstdint 文档引入了一个有趣的声明:int8_t、int16_t、int32_t 和 int64_t 类型中的负值被明确指定为使用 2 的补码表示。
此规范提出了一个问题:是否使用2 对这些类型中负值的补码改变了未定义的行为状态溢出?
不幸的是,答案仍然是是。根据 C 11 标准的第 18.4.1 节,头文件定义的所有函数、类型和宏与 C 标准的第 7.20 节相同。 C11 标准的第 7.20.1.1 节进一步阐明了 intN_t 作为具有 2 的补码表示形式的有符号整数类型的定义。
尽管有 2 的补码表示形式的规范,C 11 标准在第 5/4 节中明确指出,任何导致未定义数学结果或超出其类型可表示范围的表达式将导致未定义
因此,对负值使用 2 的补码并不意味着这些类型的算术遵循模 2^n 行为。然而,对于无符号整数,标准明确规定应用算术模 2^n 的法则,从而以数学方式定义溢出行为并使其处于可表示的范围内。因此,无符号溢出不被视为未定义行为。
以上是2 的补码表示法是否消除了 C 有符号整数溢出中的未定义行为?的详细内容。更多信息请关注PHP中文网其他相关文章!