【发布时间】:2018-07-02 07:19:43
【问题描述】:
我正在尝试以不同的数据类型访问联合位。例如:
typedef union {
uint64_t x;
uint32_t y[2];
}test;
test testdata;
testdata.x = 0xa;
printf("uint64_t: %016lx\nuint32_t: %08x %08x\n",testdata.x,testdata.y[0],testdata.y[1]);
printf("Addresses:\nuint64_t: %016lx\nuint32_t: %p %p\n",&testdata.x,&testdata.y[0],&testdata.y[1]);
输出是
uint64_t: 000000000000000a
uint32_t: 0000000a 00000000
Addresses:
uint64_t: 00007ffe09d594e0
uint32_t: 0x7ffe09d594e0 0x7ffe09d594e4
y指向的起始地址与x的起始地址相同。由于两个字段使用相同的位置,x 的值不应该是 00000000 0000000a 吗?
为什么没有发生这种情况?内部转换如何发生在具有不同数据类型的不同字段的联合中?
需要做什么才能使用联合以与 uint64_t 相同的顺序检索 uint32_t 的确切原始位?
编辑: 如 cmets 中所述,C++ 给出了未定义的行为。 它在 C 中是如何工作的?我们真的可以做到吗?
【问题讨论】:
标签: c++ c bit-manipulation unions