在C中将int移位32次

时间:2012-08-27 16:13:55

标签: c bit-shift

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

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

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

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

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

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

结果= 0xFFFFFFFF(全部。)

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

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

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

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

4 个答案:

答案 0 :(得分:6)

这是未定义的行为

Why doesn't left bit-shift, "<<", for 32-bit integers work as expected when used more than 32 times?

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

答案 1 :(得分:5)

按操作数的位数移动有未定义的行为,这就是为什么你得到“意外”的结果。

答案 2 :(得分:1)

以下是C99标准的引用:

6.5.7按位移位运算符  [...]

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

归功于original source

答案 3 :(得分:1)

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

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

如果你想获得0xFFFFFFFF,你必须转移31次,而不是32次。想一想!