gpt4 book ai didi

c - 在 C 中提取 16 位 union 中的位位置

转载 作者:太空宇宙 更新时间:2023-11-04 01:18:16 24 4
gpt4 key购买 nike

我想在 C 中声明一个 union,主要包含一个 16 位 字,我应该可以读/写 LSP 7 bits8th bit 分别用于 16-bit 字中的每个字节,所以我声明如下:

typedef union {
uint8_t full_8_char_byte[2];
uint8_t ascii_7_bits_word_0 : 7; /* another way of representing LSP 7 ASCII bits */
uint8_t parity_bit_word_0 : 1; /* another way of representing MSP parity bit */
uint8_t ascii_7_bits_word_1 : 7; /* another way of representing LSP 7 ASCII bits */
uint8_t parity_bit_word_1 : 1; /* another way of representing MSP parity bit */
} ip_char_t;

现在,当我将 7 位 值写入 16 位 字中的这些单独字节时:

x.full_8_char_byte[0] = 0x7E;
x.full_8_char_byte[1] = 0x7E;

下面的简单程序:

int main()
{
ip_char_t x;
x.full_8_char_byte[0] = 0x7E;
x.full_8_char_byte[1] = 0x7E;

printf("%c %c\n", x.full_8_char_byte[1], x.full_8_char_byte[0]);
printf("%u %u\n", x.full_8_char_byte[1], x.full_8_char_byte[0]);
printf("%X %X\n\n", x.full_8_char_byte[1], x.full_8_char_byte[0]);

printf("%c %c\n", x.ascii_7_bits_word_1, x.ascii_7_bits_word_0);
printf("%u %u\n", x.ascii_7_bits_word_1, x.ascii_7_bits_word_0);
printf("%X %X\n\n", x.ascii_7_bits_word_1, x.ascii_7_bits_word_0);

printf("%d %d\n", x.parity_bit_word_1, x.parity_bit_word_0);
return 0;
}

给出正确的输出如下:

~   ~  
126 126
7E 7E

~ ~
126 126
7E 7E

0 0

但是当我将 x.full_8_char_byte[1] 初始化为 8 位值时:

x.full_8_char_byte[0] = 0x7E;
x.full_8_char_byte[1] = 0xFF;

我得到的输出是:

�   ~ 
255 126
FF 7E

~ ~
126 126
7E 7E

0 0

当我将 x.full_8_char_byte[0] 初始化为 0xFF 时会发生类似的事情,我的问题是为什么 x.ascii_7_bits_word_1x.parity_bit_word_1 没有反射(reflect) x.full_8_char_byte[1] 中的每个更改?

最佳答案

看看这个:

typedef union {
uint8_t full_8_char_byte[2];
uint8_t ascii_7_bits_word_0 : 7; /* another way of representing LSP 7 ASCII bits */
uint8_t parity_bit_word_0 : 1; /* another way of representing MSP parity bit */
uint8_t ascii_7_bits_word_1 : 7; /* another way of representing LSP 7 ASCII bits */
uint8_t parity_bit_word_1 : 1; /* another way of representing MSP parity bit */
} ip_char_t;

注释建议您期望 4 个位域成员映射第一个数组成员的位。这是行不通的,因为 union所有 成员都是可选的可能内容,这也意味着每个成员都将放在最开始。你可能想写的是

typedef union {
uint8_t full_8_char_byte[2];
struct {
uint8_t ascii_7_bits_word_0 : 7; /* another way of representing LSP 7 ASCII bits */
uint8_t parity_bit_word_0 : 1; /* another way of representing MSP parity bit */
uint8_t ascii_7_bits_word_1 : 7; /* another way of representing LSP 7 ASCII bits */
uint8_t parity_bit_word_1 : 1; /* another way of representing MSP parity bit */
};
} ip_char_t;

所以这个 union 可以或者包含你的数组或者一个带有位域的结构。


请注意,这并不能以可移植的方式解决您的问题:对于您的位域的排列方式没有严格的保证,有关详细信息,请参阅 Leushenko 的评论!为了方便地解决这个问题,您可以提供宏来访问各个位,例如

typedef uint8_t ip_char_t[2];

#define ascii_7_bits_word(x,i) ((x)[i] & 0x7f)
#define parity_bit_word(x,i) ((x)[i] >> 7)

或者,如果您还需要写入位或想要强制类型安全,请改为编写(内联)函数。

关于c - 在 C 中提取 16 位 union 中的位位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51513418/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com