位移是否依赖于字节序?
假设我有数字'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
[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会更有意义,这就是常见的内存映射图。