我有一个特定的C位移位方案,我不相信Stack Overflow已经涵盖了。 (如果是的话,我一直无法找到它!)
本练习使用signed int
作为数据类型。
取值0x80000000
(最高位只是1。)
使用算术右移(我的确如此)在机器上右移一次。
结果= 0xC0000000
(最左边字节为1100 0000)。
继续转移它,你应该从左到右填充它们。
结果= 0xFFFFFFFF
(全部。)
但是:尝试相同的示例,但一起转移一个额外的位置:
0x80000000 >> 0x00000020
(右移32次)
你的结果?我不知道。我的结果不是全部。事实上,我得到0x00000001
这不是我想要的行为。为什么是这样?它是机器特定的吗?
(上下文:家庭作业将我的操作限制在几位操作员手中以解决难题。这是一个难题的一个方面,但远不是整个问题。)
答案 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)
答案 3 :(得分:1)
不允许移动超过宽度的值。 int数的含量是多少?好吧,在32位系统中它是32位。如果您尝试在gcc中移动大于32的int,则会收到此警告:
warning: right shift count >= width of type [enabled by default]
如果你想获得0xFFFFFFFF
,你必须转移31次,而不是32次。想一想!