加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 为什么`int >> 32`不总是为零?

发布时间:2020-12-16 10:53:42 所属栏目:百科 来源:网络整理
导读:参见英文答案 Weird behavior of right shift operator (1 32)????????????????????????????????????7个 有人可以解释一下为什么一些4字节整数的32位按位移位可能在C/C++中不返回零吗?为什么它依赖于编译器的-O选项? 例如,在gcc 4.8.3中,此代码为-45提供了
参见英文答案 > Weird behavior of right shift operator (1 >> 32)????????????????????????????????????7个
有人可以解释一下为什么一些4字节整数的32位按位移位可能在C/C++中不返回零吗?为什么它依赖于编译器的-O选项?

例如,在gcc 4.8.3中,此代码为-45提供了-O0和0以及-O3选项:

unsigned int x = 45; // 4 bytes
x = x >> 32;
printf("%un",x);

为什么会这样?

解决方法

因为它是未定义的行为:[expr.shift]说

The behavior is undefined if the right operand is negative,or greater than or equal to the length in bits of the promoted left operand.

至于具体的未定义行为,我想它如下:

>使用-O0,它编译为实际在机器代码中执行右移,并且在某些机器上(例如我相信x86就是这样),移位功能仅在移位32位字时查看移位量的低5位;移位32与移位0相同.
>使用-O3,编译器自己计算常量,只是将0放入程序而不是进行计算.

您可以检查装配输出以查看我的预测是否正确.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读