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