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,或者它依赖于字节序/编译器/平台/目标/运气等等?我已经查看了我的编译代码的反汇编,这就是我在特定情况下的情况,但我很好奇这段代码是否可移植.
这是不可移植的原因有几个:
chars[0]寻址最低字节unsigned long不能保证准确,只要是为4字符,所以根据不同的平台上,你甚至可能没有得到完整的long(或的sizeof( long)可能会更小,然后4你继续读下去,但是这是不可能的8位处理器,至少.总而言之,这些代码根本不可移植.
通常,如果您需要关心字节序,那您就在做错事,并且需要解决您的问题(例如,使用移位和掩码或序列化/反序列化)。
例如,除了工会以外,您应该执行以下操作:
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)
| 归档时间: |
|
| 查看次数: |
2965 次 |
| 最近记录: |