首页 > 后端开发 > C++ > 正文

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

Barbara Streisand
发布: 2024-10-27 13:48:01
原创
694 人浏览过

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!