假设我有号码 'numb'=1025 [00000000 00000000 00000100 00000001]
代表:
在 Little-Endian 机器上:
00000001 00000100 00000000 00000000
在大端机上:
00000000 00000000 00000100 00000001
现在,如果我在 10 位上应用左移(即:numb <<= 10),我应该:
[A] 在 Little-Endian 机器上:
正如我在 GDB 中注意到的那样,Little Endian 通过 3 个步骤完成左移:[我已经展示了“3”个步骤以更好地理解处理过程]
处理编号。在大端约定中:
00000000 00000000 00000100 00000001
应用左移:
00000000 00010000 00000100 00000000
再次以 Little-Endian 表示结果:
00000000 00000100 00010000 00000000
[乙]。在大端机器上:
00000000 00010000 00000100 00000000
我的问题是:
如果我直接在 Little Endian 上应用 Left Shift 约定,它应该给出:
numb
:
00000001 00000100 00000000 00000000
numb << 10
:
00010000 00000000 00000000 00000000
但实际上,它给出了:
00000000 00000100 00010000 00000000
为了仅实现第二个结果,我在上面展示了三个假设步骤。
请解释为什么以上两个结果不同: numb << 10
的实际结果与预期结果不同。
最佳答案
字节顺序是值存储在内存中的方式。当加载到处理器中时,无论字节顺序如何,移位指令都会对处理器寄存器中的值进行操作。因此,从内存加载到处理器相当于转换为大端,然后进行移位操作,然后将新值存储回内存,这是小端字节顺序再次生效的地方。
更新,感谢@jww:在 PowerPC 上, vector 移位和旋转是字节序敏感的。您可以在 vector 寄存器中有一个值和一个移位 will produce different results on little-endian and big-endian .
关于c - 位移是否取决于字节顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7184789/