首页 >后端开发 >C++ >为什么 (1 >> 32) 在 C 中返回 1:深入探讨右移运算符行为和未定义行为?

为什么 (1 >> 32) 在 C 中返回 1:深入探讨右移运算符行为和未定义行为?

Barbara Streisand
Barbara Streisand原创
2024-10-27 13:48:01758浏览

Why Does (1 >> 32) C 语言中的 Return 1:深入研究右移运算符行为和未定义行为? 
> 32) C 语言中的 Return 1:深入研究右移运算符行为和未定义行为? " />

对右移运算符 (1 >> 32) 的好奇

在使用右移运算符 (>>) 时C 代码中,通常假设移位大于或等于操作数宽度的值将导致零,但是,如提供的代码片段所示,这种假设可能会导致意外行为。

函数 foo(a, b) 将整数 a 移动 b 位,当使用参数 (1, 32) 调用时,它令人惊讶地返回 1 而不是预期的 0。此行为源于编译器处理常量表达式 1 >>> 。编译时为 32,由于 C 标准中描述的未定义行为,它的计算结果为 0。

相反, bar(a, b) 函数对 64 位无符号整数进行操作并正确返回移位 32 位时为 0。这是因为 64 大于 32,保证移位会产生 0。但是,即使对于 bar,移位 64 位仍可能返回 1。

进一步阐明此行为,移位操作的硬件实现将移位计数屏蔽为 5 或 6 位(取决于架构),有效地截断任何大于或等于 32 或 63 的移位计数。因此,某些架构上的逻辑右移 (LSR) 可确保移位 ≥32 将始终产生零。

这突出了将 32 位整数移位 ≥32 的不可移植性,因为结果可能会因底层硬件实现而异。

以上是为什么 (1 >> 32) 在 C 中返回 1:深入探讨右移运算符行为和未定义行为?的详细内容。更多信息请关注PHP中文网其他相关文章!

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