在C中将int移位32次

我有一个特定的C位移位方案,我不相信Stack Overflow已经涵盖了。 (如果是的话,我一直找不到它!)

本练习使用signed int s作为数据类型。

取值0x80000000 (在最高位中只是1。)

使用算术右移(我的确如此)在机器上右移一次。

结果= 0xC0000000 (最左边字节为1100 0000)。

继续移动它,你应该从左到右填充它们。

结果= 0xFFFFFFFF (全部。)

但是:尝试相同的示例,但一起移动一个额外的位置:

0x80000000 >> 0x00000020 (右移32次)

你的结果? 我不知道。 我的结果不是全部。 事实上,我得到了0x00000001这不是我想要的行为。 为什么是这样? 它是机器特定的吗?

(上下文:家庭作业将我的操作限制在一些操作员手中以解决难题。这是一个难题的一个方面,但远不是整个问题。)

这是未定义的行为

当使用超过32次时,32位整数为什么不按预期工作的位移“<<”?

这意味着你应该像瘟疫一样避免它。 这里有一些链接,包括“每个C程序员应该知道什么是未定义的行为”: http : //lwn.net/Articles/511767/

按操作数的位数移动具有未定义的行为,这就是您获得“意外”结果的原因。

以下是C99标准的引用:

6.5.7按位移位算子[…]

3 […]如果右操作数的值为负或大于或等于提升的左操作数的宽度,则行为未定义。

信用原始来源 。

您不允许移动超过宽度的值。 int数的含量是多少? 那么,在32位系统中它是32位。 如果您尝试在gcc中移动大于32的int,则会收到以下警告:

 warning: right shift count >= width of type [enabled by default] 

如果你想得到0xFFFFFFFF你必须换31次,而不是32次。 想一想!