编写一个 C 程序以获取 32 位整数并使用 union 显示高位和低位字(16 位)

问题描述 投票:0回答:2
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;
}

上述代码的输出仅是低位,而不是高位,所以任何人都可以帮助找到高位值吗?

c embedded
2个回答
2
投票

除了 @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

2
投票

在您的示例中,所有三个

data
low
high
彼此重叠。

根据您的

printf()
声明,声明工会如下:

union breakbit {
    uint32_t data;
    struct {
        uint16_t low;
        uint16_t high;
    } uplow;
} var;

low
high
的含义在不同的机器上会有所不同。
(参见“大端/小端”)


处理十六进制值时,您可能需要使用

unsigned
数据类型。

© www.soinside.com 2019 - 2024. All rights reserved.