union breakbit {
int32_t data;
int16_t low;
int16_t high;
} var;
int main() {
var.data = 0x12345678;
printf("Initial value:%x\n",var.data);
printf("Higher bit value:%x\n",var.uplow.high);
printf("Higher bit value:%x\n",var.uplow.low);
return 0;
}
上述代码的输出仅是低位,而不是高位,所以任何人都可以帮助找到高位值吗?
除了 @Fe2O3 好的答案并理清字节序:
#include <stdint.h>
#include <stdio.h>
union breakbit {
uint32_t data32;
uint16_t data16[2];
};
// Using a C99 compound literal to index the LS half.
#define LS_INDEX ((const union breakbit){ .data32 = 1}.data16[1])
int main(void) {
union breakbit var = {.data32 = rand() * (RAND_MAX + 1ul) + rand()};
printf("Initial value:%08lx\n", (unsigned long) var.data32);
printf("Higher bits value:%04x\n", var.data16[!LS_INDEX]);
printf(" Lower bits value:%04x\n", var.data16[LS_INDEX]);
}
输出:
Initial value:c0b18ccf
Higher bits value:c0b1
Lower bits value:8ccf
在您的示例中,所有三个
data
、low
和 high
彼此重叠。
根据您的
printf()
声明,声明工会如下:
union breakbit {
uint32_t data;
struct {
uint16_t low;
uint16_t high;
} uplow;
} var;
low
和high
的含义在不同的机器上会有所不同。 处理十六进制值时,您可能需要使用
unsigned
数据类型。