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