联合和位字段交互如何工作?

这是一个示例:

struct field
{
    unsigned int a : 8;
    unsigned int b : 8;
    unsigned int c : 8;
    unsigned int d : 8;
};

union test
{
    unsigned int raw;
    field bits;
};

int main()
{

    test aUnion;
    aUnion.raw = 0xabcdef;

    printf("a: %x \n",aUnion.bits.a);
    printf("b: %x \n",aUnion.bits.b);
    printf("c: %x \n",aUnion.bits.c);
    printf("d: %x \n",aUnion.bits.d);


    return 0;
}

现在运行它,我得到:

a: ef
b: cd
c: ab
d: 0

我想我只是不真正了解这里发生的事情。因此,我将raw设置为一个值,并且由于这是一个并集,因此所有其他东西都会从该值中提取出来,因为它们都被设置为小于unsigned int?所以位域是基于原始的?但是如何绘制呢?为什么在这种情况下d:0?

在这里,我将不胜感激。

sajensenhanyya 回答:联合和位字段交互如何工作?

这是因为您的unsigned int的32位长度不够长(未设置所有32位),无法完全填充所有位字段值。因为它只有24位长,所以位字段d显示的是00的十六进制值。尝试例如

aUnion.raw = 0xffabcdef;

会产生

a: ef 
b: cd 
c: ab 
d: ff

由于dd位字段占用了24-32位(在小字节序上),除非已为分配的unsigned int字段分配了一个值,该值占用了那些已设置的位,所以该位字段的位置不会也显示值。

,

使用整数的十六进制表示很有用,因为它可以清楚整数的每个字节的值是多少。所以设置

aUnion.raw = 0xabcdef;

表示最低有效字节的值为0xef,第二最低有效字节的值为0xcd,依此类推。但是,您要设置 union raw字段,该字段是整数,因此长度为4个字节。在前面的表示中,最高有效字节丢失了,因此可以写为

aUnion.raw = 0x00abcdef;

(这就像明确表明整数x = 420几百个,0几千个等等)。

您的联合字段分别代表整数a =byte[0]的{​​{1}},b = byte[1]c = byte[2]d = byte[3],因为联合中的所有元素共享相同的内存位置。这是真的,因为您是在小端体系结构中运行代码的(最低有效字节在前)。

所以:

raw
本文链接:https://www.f2er.com/2430625.html

大家都在问