【问题标题】:Is shifting bits dependent on the endianness?移位是否取决于字节序?
【发布时间】:2020-11-27 06:58:50
【问题描述】:

我知道如果我想做 2n 那么我可以做(0x1ul << n) 并且我会得到结果。

如果处理器是大端的怎么办?如果我向左移动,会不会导致错误的输出?当我们有一个大端架构时,(0x1ul << n) 是否会出错,即不等于 2n?我如何证明这一点?

【问题讨论】:

  • 在 C 中,^ 是 XOR 运算符,所以一般(0x1ul << n) != 2^n 与字节序无关。
  • @tannoyconnect 编译器负责低端架构细节,如果架构不是小端架构,编译器会进行调整。

标签: c embedded endianness microprocessors


【解决方案1】:

仅当您分解多字节数量并尝试将字节存储在连续的内存位置时,字节序才有意义。但是,如果您有一个 32 位寄存器来存储 32 位值,那么谈论字节序是没有意义的。寄存器既不是大端也不是小端;它只是一个保存 32 位值的寄存器。最右边的位是最低位,最左边的位是最高位。

在这种情况下也是如此,一旦变量的值从内存加载到寄存器进行移位,不管它是哪个字节序,它所做的只是按照指定的移位并存储回内存中。

参考:Writing endian-independent code in C

【讨论】:

    【解决方案2】:

    您困惑的根源似乎在于“左”和“右”的含义。在<<>> 运算符的意义上,它们的含义是通常的算术意义上的,其中数字从右边的最低有效位到左边的最高有效位。事实上,C 将这些运算符定义为 算术 运算符,而不是按位运算符,作为定义它们的输入的适当的 2 幂的乘法或除法。

    特别是,这些运算符不会在“内存”中“向左”或“向右”移动位;它们甚至不作用于记忆,而是作用于价值观。有时考虑使用它们在内存中移动字节是有意义的(移位是 8 的倍数),在这种情况下,您是否需要 <<>> 将字节“向左”移动“在内存中” (在表示中)取决于表示是小端还是大端。您会在 this implementation of memcpy for ARM that works on older chips without support for misaligned access 之类的地方看到这种情况。

    【讨论】:

      【解决方案3】:

      当我们有一个大端架构时,(0x1ul

      不,随着0x1ul << n 适合unsigned long,一切都很好。字节(或位)字节序不相关。

      【讨论】:

        猜你喜欢
        • 2011-11-03
        • 2014-10-13
        • 1970-01-01
        • 2017-06-06
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 2013-07-13
        相关资源
        最近更新 更多