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

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

Linda Hamilton
Linda Hamilton原创
2024-12-25 01:18:25680浏览

Is Signed Integer Overflow in C   Still Undefined Behavior?

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

正如 C 11 cstdint 文档中所强调的,有符号整数类型,例如 int8_t、int16_t 、int32_t 和 int64_t 利用 2 的补码表示负数价值观。这引发了一个问题:这是否意味着这些类型中的溢出不再被视为未定义行为?

不,这些类型的溢出在 C 中仍然是未定义行为。

根据 C 11 标准第 5/4 段,任何结果未在数学上定义或超出类型可表示范围的表达式都会导致未定义

虽然 int8_t、int16_t、int32_t 和 int64_t 使用 2 的补码,但这并不意味着应用算术模 2^n。标准明确指出:

“无符号算术运算的结果始终是‘数学定义的’,并且结果始终在可表示的范围内;因此,5/4 不适用。”

因此,无符号算术遵循模 2^n 算术定律,溢出不是未定义的行为。然而,对于有符号算术,溢出仍然是未定义的行为,无论底层表示如何。

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

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