2

我想用一个结构和一个uint64_t进行联合,所以我可以用结构引用单个uint16_ts,并将它们连接到uint64_t中。我做了这个测试程序:

#include "stdio.h"
#include "stdint.h"
struct test_struct{
    uint16_t stuff;
    uint16_t a;
    uint16_t b;
    uint16_t c;
};

union test_union{
    struct test_struct str;
    uint64_t uint;
};    

int main(){
    struct test_struct x = {
        .stuff = 0x0000,
        .a = 0x1234,
        .b = 0x5678,
        .c = 0x9ABC
    };
    union test_union y;
    y.str = x;

    printf("y.uint: %llX\n", y.uint);
}

输出变为:

y.uint: 9ABC567812340000

这对我来说是违反直觉的(应该是 0000123456789ABC 或 123456789ABC)。有人可以向我解释为什么结构中的元素似乎被颠倒了吗?

编辑:供将来参考:字节顺序的答案让我感到困惑,因为 uint16_ts 以正确的顺序打印。但这当然是因为它们本身是小端存储的。

4

4 回答 4

7

您在一个 little-endian 平台上,首先存储的字节(具有最低地址)最终位于组合uint64_t.

如果你在大端平台上运行相同的代码,你会得到你期望的结果。您的代码不能跨具有不同字节顺序的系统移植。

于 2013-03-11T13:37:19.213 回答
0

这一切都与Endianess有关。我不认为 C/C++ 语言定义了它的工作方式,而是由实现/目标 CPU 来定义。在大端 CPU 上,你会得到你所期望的。

于 2013-03-11T13:37:58.200 回答
0

如果您的处理器是“小端”,则 LSB 存储在最低地址上,因此这是正常输出。在 Intel 的 x86 平台上,通常它是 little-endian。相比之下,摩托罗拉的PowerPC是big-endian,也就是说MSB存储在最低地址。

于 2013-03-11T13:41:21.410 回答
0

这是因为Little Endianess

于 2013-03-11T13:44:05.513 回答