假设我有'numb'=1025 [00000000 00000000 00000100 00000001]代表的数字:
'numb'=1025 [00000000 00000000 00000100 00000001]
在小端机器上:
00000001 00000100 00000000 00000000
在大端机器上:
00000000 00000000 00000100 00000001
现在,如果我在 10 位上应用左移(即:numb <<= 10),我应该:
[A] 在小端机器上:
正如我在 GDB 中注意到的那样,Little Endian 分 3 个步骤执行左移:[我已经展示了 ‘3’ 步骤以更好地理解处理过程]
对待没有。在大端约定中:
应用左移:
00000000 00010000 00000100 00000000
再次用 Little-Endian 表示结果:
00000000 00000100 00010000 00000000
[乙]。在大端机器上:
我的问题是:
如果我直接在 Little Endian 约定上应用左移,它应该给出:
numb:
numb
numb << 10:
numb << 10
00010000 00000000 00000000 00000000
但实际上,它给出了:
为了仅实现第二个结果,我在上面展示了三个假设步骤。
请解释我为什么上述两个结果不同: 的实际结果numb << 10与预期结果不同。
字节序是值存储在内存中的方式。当加载到处理器中时,无论字节顺序如何,移位指令都会对处理器寄存器中的值进行操作。因此,从内存加载到处理器相当于转换为大端,然后进行移位操作,然后将新值存储回内存中,这就是小端字节顺序再次生效的地方。
更新,感谢@jww:在 PowerPC 上,矢量移位和旋转是字节序敏感的。您可以在向量寄存器中有一个值,并且移位将在 little-endian 和 big-endian 上产生不同的结果。