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

标签 c endianness

假设我有号码 '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”个步骤以更好地理解处理过程]

  1. 处理编号。在大端约定中:

    00000000        00000000        00000100    00000001
    
  2. 应用左移:

    00000000        00010000        00000100        00000000
    
  3. 再次以 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/

相关文章:

c - Endianness——为什么 chars 将 Int16 打印倒过来?

c# - 将 char * 发送到字符串 c#

c - 如何通过地址交换两个号码?

c - 删除和替换文件后哈希函数返回不同的结果

Java readInt 方法返回 Scala 中 Int 的 LittleEndian 而不是 BigEndian 值

c - 如何使用 C 以编程方式找到我的 PC 的 Endian-ness?

linux - objdump 和 xxd 的区别

c - 如何根据 "Endianness"以位级别存储数据?

c - 棘手的指针别名问题

c - 在 Ansi-C 中导入 Delphi Dll