假设我用数字'numb'=1025 [00000000 00000000 00000100 00000001]表示:

在Little Endian机器上:

00000001 00000100 00000000 00000000

在Big Endian机器上:

00000000 00000000 00000100 00000001

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

[A] 在Little Endian机器上:

正如我在GDB中注意到的,Little Endian分3步左移:[我展示了'3'步,以便更好地理解处理过程]

  1. 对待Big Endian约定中的编号:

    00000000        00000000        00000100    00000001
    
  2. 应用左移:

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

    00000000        00000100        00010000        00000000 
    

[B]. 在Big Endian机器上:

00000000        00010000        00000100        00000000

我的问题是:

如果我直接在小端点上应用左移位

numb:

00000001 00000100 00000000 00000000

numb << 10:

00010000 00000000 00000000 00000000

但实际上,它给了我们:

00000000        00000100        00010000        00000000 

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

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

推荐答案

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

更新,感谢@jww:在PowerPC上,向量移位和旋转是endian敏感的.向量寄存器中可以有一个值,移位will produce different results on little-endian and big-endian.

C++相关问答推荐

C sscanf没有捕获第二个参数

如何在不修改字符串缓冲区早期使用的情况下覆盖字符串缓冲区

了解一些CLIPS原语数据类型

为什么我得到更多的256假阳性在PKZIP解密密钥验证?

为什么复合文字(C99)的返回会生成更多的汇编代码?

为什么我会收到释放后堆使用错误?

如何使解释器存储变量

试图创建一个基本的Word克隆,但遇到了障碍

为什么编译器不能简单地将数据从EDI转移到EAX?

C程序向服务器发送TCPRST

有没有办法减少C语言中线程的堆大小?

无算术运算符和循环的二进制乘法

当我将偏移量更改为任何非零值时,C中的mmap共享内存出现无效参数错误

区分MySQL C界面中的文本和BLOB字段

函数指针作为函数参数 - 应该使用 const 吗?

如何使用 VLA 语法使用 const 指针声明函数

仅使用其内存地址取消引用 C 中的 struct

C23 中的 [[reproducible]] 和 [[unsequenced]] 属性是什么?什么时候应该使用它们?

当循环变量在溢出时未定义时,可以进行哪些优化?

当 a 是代码块时使用逗号运算符 (a, b)