long和char []的联合,字节顺序

KNf*_*rPn 3 c endianness unions

如果我在8位处理器的代码中执行以下操作:

typedef union
{
unsigned long longn ;
unsigned char chars[4];
} longbytes;
Run Code Online (Sandbox Code Playgroud)

longbytes.chars[0]总是将是最低的字节longbytes.longn,或者它依赖于字节序/编译器/平台/目标/运气等等?我已经查看了我的编译代码的反汇编,这就是我在特定情况下的情况,但我很好奇这段代码是否可移植.

Gri*_*zly 7

这是不可移植的原因有几个:

  • 这取决于您的平台(或编译器)强制执行哪个字节首先写入的字节顺序,因此您不能指望chars[0]寻址最低字节
  • unsigned long不能保证准确,只要是为4字符,所以根据不同的平台上,你甚至可能没有得到完整的long(或的sizeof( long)可能会更小,然后4你继续读下去,但是这是不可能的8位处理器,至少.
  • 读写一个不同的联盟成员然后你写的通常是不可移植的,它是实现定义的行为.其原因基本上是两个其他问题的结合.

总而言之,这些代码根本不可移植.


Bre*_*dan 5

通常,如果您需要关心字节序,那您就在做错事,并且需要解决您的问题(例如,使用移位和掩码或序列化/反序列化)。

例如,除了工会以外,您应该执行以下操作:

uint32_t pack(uint8_t byte0, uint8_t byte1, uint8_t byte2, uint8_t byte3) {
    long result;

    result = byte0;
    result |= byte1 << 8;
    result |= byte2 << 16;
    result |= byte3 << 24;
    return result;
}

uint8_t unpack(int byteNumber, uint32_t value) {
    return (value >> (byteNumber * 8));
}
Run Code Online (Sandbox Code Playgroud)