首页 >后端开发 >C++ >C 中的有符号整数溢出仍然是未定义的行为吗?

C 中的有符号整数溢出仍然是未定义的行为吗?

DDD
DDD原创
2024-12-21 04:02:09823浏览

Is Signed Integer Overflow Still Undefined Behavior in C  ?

C 中有符号整数溢出仍然是未定义行为吗?

根据 C 11 标准中的定义,有符号整数溢出仍然是未定义行为。尽管 cstdint 文档指出 int8_t、int16_t、int32_t 和 int64_t 类型对负值使用 2 的补码,但溢出行为仍然被视为未定义。

C 11 标准第 5/4 段强调指出:

**如果在表达式求值过程中,结果未在数学上定义或不在其类型的
可表示值的范围,行为是未定义的。**

因此,即使这些有符号类型采用了二进制补码表示,算术模 2^n 也不会在

相反,C 11 标准在第 3.9.1/4 段中明确规定无符号算术遵循模数算术:

无符号整数,声明为无符号,应遵循算术模 2^n 法则,其中 n 是特定大小整数的值表示中的
位数

因此,无符号算术运算总是在数学上可以定义的,并且结果值在可表示的范围内,从而免除它未定义的行为条款。脚注 46 进一步澄清了这一点:

这意味着 无符号算术不会溢出,因为无法由结果
无符号整数类型表示的结果会以 1 为模进行减少大于
结果无符号整数类型可以表示的最大值。

总而言之,当使用有符号类型的 2 的补码表示为负值提供了明确定义的行为,这些类型的整数溢出在 C 中仍然是未定义的行为,因为标准覆盖了任何依赖于实现的行为。

以上是C 中的有符号整数溢出仍然是未定义的行为吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn