计数超出类型宽度时右移的未定义行为
在 C 中,右移运算符 (>>) 的行为在标准中定义,特别是在第 5.8 节“移位运算符”中。问题是,大于或等于左操作数类型宽度的移位计数是否是未定义行为。
C 标准规定 E1 的值>>> E2 是 E1/2^E2 的商的整数部分,其中 E1 是左操作数,E2 是右操作数。这意味着仅当 E1 具有无符号类型或具有非负值的有符号类型并且 E2 为非负时才定义该行为。
但是,该问题考虑了 E1 为无符号类型的情况int 和 E2 为 34,超出了无符号 int 的 32 位宽度。标准明确指出这种情况下的行为是未定义的。
因此,尽管 C 标准中关于商计算的声明,但右移计数大于 32 的无符号 int 的行为是未定义的。这就是 GCC 在执行此类转变时发出警告的原因。
以上是右移计数超出其类型宽度的无符号整数 C 中的未定义行为吗?的详细内容。更多信息请关注PHP中文网其他相关文章!