小编典典

位移是否取决于字节顺序?

all

假设我有'numb'=1025 [00000000 00000000 00000100 00000001]代表的数字:

在小端机器上:

00000001 00000100 00000000 00000000

在大端机器上:

00000000 00000000 00000100 00000001

现在,如果我在 10 位上应用左移(即:numb <<= 10),我应该:

[A] 在小端机器上:

正如我在 GDB 中注意到的那样,Little Endian 分 3 个步骤执行左移:[我已经展示了 ‘3’ 步骤以更好地理解处理过程]

  1. 对待没有。在大端约定中:

    00000000        00000000        00000100    00000001
    
  2. 应用左移:

    00000000        00010000        00000100        00000000
    
  3. 再次用 Little-Endian 表示结果:

    00000000        00000100        00010000        00000000
    

[乙]。在大端机器上:

00000000        00010000        00000100        00000000

我的问题是:

如果我直接在 Little Endian 约定上应用左移,它应该给出:

numb

00000001 00000100 00000000 00000000

numb << 10

00010000 00000000 00000000 00000000

但实际上,它给出了:

00000000        00000100        00010000        00000000

为了仅实现第二个结果,我在上面展示了三个假设步骤。

请解释我为什么上述两个结果不同: 的实际结果numb << 10与预期结果不同。


阅读 85

收藏
2022-08-21

共1个答案

小编典典

字节序是值存储在内存中的方式。当加载到处理器中时,无论字节顺序如何,移位指令都会对处理器寄存器中的值进行操作。因此,从内存加载到处理器相当于转换为大端,然后进行移位操作,然后将新值存储回内存中,这就是小端字节顺序再次生效的地方。

更新,感谢@jww:在 PowerPC 上,矢量移位和旋转是字节序敏感的。您可以在向量寄存器中有一个值,并且移位将在 little-endian 和
big-endian 上产生不同的结果

2022-08-21