位移是否依赖于字节序?

假设我有数字'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 

[B]。 在大端机器上:

 00000000 00010000 00000100 00000000 

我的问题是:

如果我直接在小尾巴公约上应用左移,应该给:

numb

 00000001 00000100 00000000 00000000 

numb << 10

 00010000 00000000 00000000 00000000 

但实际上,它给:

 00000000 00000100 00010000 00000000 

为了达到第二个结果,我已经展示了三个假设的步骤。

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

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

不,像C的任何其他部分一样,移位是用数值而不是表示来定义的。 左移1是2的复制,右移是除法。 (像往常一样,在使用按位操作时,要小心签名。对于无符号整型,一切都是最好的。

电脑不会像我们这样写数字。 价值只是转移。 如果你坚持逐字节查看(即使计算机不是这样做的话),你可以说在一个小端机器上,第一个字节向左移动,多余的位进入第二个字节,等等。

(顺便说一下,如果你垂直地写字节而不是水平地写高字节,那么little-endian会更有意义,这就是常见的内存映射图。