首页 > 后端开发 > C++ > 2 的补码表示法是否消除了 C 有符号整数溢出中的未定义行为?

2 的补码表示法是否消除了 C 有符号整数溢出中的未定义行为?

Mary-Kate Olsen
发布: 2024-12-23 19:54:09
原创
1000 人浏览过

Does 2's Complement Representation Eliminate Undefined Behavior in C   Signed Integer Overflow?

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板