Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 结构中并集的位字段_C_Bit Fields - Fatal编程技术网

C 结构中并集的位字段

C 结构中并集的位字段,c,bit-fields,C,Bit Fields,我有以下两种结构:- 1. 这个结构有匿名联合,当我计算这个结构的大小时,它是12个字节(4+4+4)。这很好 二, 但是,我的32位机器上的DevC++编译器会根据这个结构的大小打印8个字节。我不明白为什么结果是8。您的第一个示例声明了一个具有匿名联合的结构 第二个示例声明了一个结构,其中包含联合的声明,即noop。例如 typedef struct bitfield { unsigned int a:16; unsigned int b:17; union u

我有以下两种结构:- 1.

这个结构有匿名联合,当我计算这个结构的大小时,它是12个字节(4+4+4)。这很好

二,


但是,我的32位机器上的DevC++编译器会根据这个结构的大小打印8个字节。我不明白为什么结果是8。

您的第一个示例声明了一个具有匿名
联合的结构

第二个示例声明了一个结构,其中包含
联合的声明,即noop。例如

typedef struct bitfield
{
    unsigned int a:16;
    unsigned int b:17;
    union u
    {    
        unsigned int c:4;
        unsigned int d:32;
    };
}bfield;

int main(void) {
    struct bitfield b;
    b.c=2;
}
将以失败告终

x.c:14:4: error: 'struct bitfield' has no member named 'c'
编译器可能会使用

x.c:9:6: warning: declaration does not declare anything

因此,您的问题与位字段无关,与匿名联合无关。

OP中的联合声明不正确(它不符合OP的要求)

它看起来只是一个联合声明,并不向结构中添加字段

将联合字段声明为匿名或命名

请看这个例子(也张贴在这里:)

在这两种情况下,struct的大小都是12字节

#include <iostream>

typedef struct bitfield
{
    unsigned int a:16;
    unsigned int b:17;
    union u
    {    
    unsigned int c:4;
    unsigned int d:32;
    }U;
}bfield;


typedef struct bitfield2
{
    unsigned int a:16;
    unsigned int b:17;
    union
    {    
    unsigned int c:4;
    unsigned int d:32;
    };
}bfield2;

int main()
{
    std::cout << "Test bitfields1\n" << sizeof(bfield) << "\n";
    std::cout << "Test bitfields2\n" << sizeof(bfield2) << "\n";

    static volatile bfield y;
    y.a=0x1234;
    y.b = 0x1FF55;
    y.U.d = 0x5a5a5a5a;
    std::cout << std::hex << y.U.d << "\n";

    static volatile bfield2 x;
    x.a=0x1234;
    x.b = 0x1FF55;
    x.d = 0x5a5a5a5a;
    std::cout << std::hex << x.d << "\n";
}
#包括
typedef结构位字段
{
无符号整数a:16;
无符号整数b:17;
联合大学
{    
无符号整数c:4;
无符号整数d:32;
}U;
}贝菲尔德;
类型定义结构位字段2
{
无符号整数a:16;
无符号整数b:17;
联盟
{    
无符号整数c:4;
无符号整数d:32;
};
}bfield2;
int main()
{

std::难道几乎不能保证位字段的布局。他说:如果32位
无符号
struct
的字节宽度超过8位,则只能有8个字节。请提供一个。假设为8位/字节,那么
struct
的大小很可能是16个字节。但这一切都取决于平台。@Olaf deunsigned的错误宽度是不相关的,因为他/她已经手动指定了每个字段的位宽度。但是我同意不能将其压缩为8个字节。看看编译器正在生成什么代码会很有趣。@jforberg:你怎么能得到相同的结果,因为我们甚至不知道OP使用的代码?@Olaf:我不知道理解你的意思。OP是问为什么在流行的Intel 32平台上使用流行的GCC编译器时会发生这种情况。这是一个完全正确的问题。如果你不知道为什么,那没关系,但请不要告诉我“去阅读标准”。或者假设我在回答之前没有阅读你的评论。或者暗示任何“其他代码”该OP可能会更改以前定义的结构的大小,这显然是错误的。@Olaf说他正在使用Dev-C++,一个使用GCC(mingw)的IDE而且只在Windows上运行。他还说他的机器是32位的。所以我认为从这一点假设他的平台是安全的,但显然这还不足以满足stack overflow的语言律师。无论如何,我认为我们已经花了足够多的时间相互交谈。祝你好运……接下来,你可能是有意的把
u
放在块的后面,而不是前面,这样你就得到了
union{uint c;uint d}u
,实际上它是匿名的
union
而不是
union的声明,而不仅仅是匿名的
union
(或
结构体
)@HaldeanBrown:那将使
u
不再是一个匿名的
union
。不确定这是否是OP想要的。啊,当然。我假设s/他想取消它的名字,因为他们正在添加额外的标记。
x.c:9:6: warning: declaration does not declare anything
#include <iostream>

typedef struct bitfield
{
    unsigned int a:16;
    unsigned int b:17;
    union u
    {    
    unsigned int c:4;
    unsigned int d:32;
    }U;
}bfield;


typedef struct bitfield2
{
    unsigned int a:16;
    unsigned int b:17;
    union
    {    
    unsigned int c:4;
    unsigned int d:32;
    };
}bfield2;

int main()
{
    std::cout << "Test bitfields1\n" << sizeof(bfield) << "\n";
    std::cout << "Test bitfields2\n" << sizeof(bfield2) << "\n";

    static volatile bfield y;
    y.a=0x1234;
    y.b = 0x1FF55;
    y.U.d = 0x5a5a5a5a;
    std::cout << std::hex << y.U.d << "\n";

    static volatile bfield2 x;
    x.a=0x1234;
    x.b = 0x1FF55;
    x.d = 0x5a5a5a5a;
    std::cout << std::hex << x.d << "\n";
}