2
#include<stdio.h>
main()
{
    union d
    {
        unsigned int a:1;
        unsigned int b:3;
        unsigned :0;
        unsigned int d:1;
        unsigned int e:1;
    };
    union d aa;
    aa.b=9;
    printf("d.aa.a=%d d.aa.b=%d",aa.a, aa.b);
system("pause");
}

この質問では、ユニオンのサイズは、ユニオンに割り当てられたビット フィールドの数とは異なります。誰でも違いを説明できますか..残りのメモリはどうなりますか?

4

3 に答える 3

5

ビットフィールドを含む型のサイズに関して、標準は次のように述べています (C11 6.7.2.1 p11):

実装では、ビットフィールドを保持するのに十分な大きさのアドレス可能なストレージユニットを割り当てることができます。

これは でありunion、ユニオン内のすべてのメンバーは から 3 ビット以下しか使用しないためunsigned int、 のサイズはunion少なくとも if のサイズcharに、システムで必要なパディング (存在する場合) を加えたものになります。union多くのシステムでは、ビットフィールドが取得される型のサイズに合わせて各ユニットがパディングされるため、この場合、 のサイズはのサイズと同じであると予想されますunsigned int(ただし、unionとにかく通常のパディング要件に)。

サイズ化された0ビットフィールドは aでは厄介unionですが、a では特別な意味がありますstruct(C11 6.7.2.1 p12):

宣言子がなく、コロンと幅のみのビットフィールド宣言は、名前のないビットフィールドを示します。特殊なケースとして、幅が 0 のビットフィールド構造体メンバーは、前のビットフィールドが配置されていたユニットにそれ以上ビットフィールドをパックしないことを示します。

したがって、あなたunionstruct代わりにだった場合:

struct d
{
    unsigned int a:1;
    unsigned int b:3;
    unsigned :0;
    unsigned int d:1;
    unsigned int e:1;
};

その場合、これのサイズはstruct少なくとも 2char秒になります (必要に応じて他のパディングも追加されます)。ほとんどの場合、実際には 2unsigned int秒のサイズになります。

于 2013-07-18T20:46:14.953 に答える