我有一个特定的 C 位移位场景,我认为 Stack Overflow 尚未涵盖该场景。 (如果是,我还没找到!)
本练习使用 signed int
作为数据类型。
取值 0x80000000
(最高有效位仅为 1。)
在机器上使用算术右移将其右移一次(我的就是这样做的)。
结果 = 0xC0000000
(最左边的字节为 1100 0000)。
继续移动它,你应该从左到右填满一个。
结果 = 0xFFFFFFFF
(全部。)
但是:尝试相同的示例,但一起移动一个额外的位置:
0x80000000 >> 0x00000020
(右移 32 次)
你的结果?我不知道。我的结果不是全部。事实上,我得到了 0x00000001
,这不是我想要的行为。为什么是这样?它是特定于机器的吗?
(上下文:作业分配将我的操作限制为几个位运算符以解决难题。这是难题的一个方面,但远非整个问题。)
最佳答案
这是未定义的行为
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/
关于c - 在 C 中将 int 移位 32 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12145636/