1

以下の構造を定義しました。

typedef union
{
    struct
    {
        unsigned command:15;
        unsigned acknowledge:1;
    };
    struct
    {
        unsigned short uicommand;
    };
    struct
    {
        Byte command_bytes[2];
    };
}TCOMMAND;

TCOMMAND EG 型の変数を宣言した後

TCOMMAND mycommand
int x=sizeof(mycommand)

x の値は 2 ではなく 4 バイトです。問題についての啓蒙をお願いします。
前もって感謝します。

4

3 に答える 3

2

C / C ++では、ビットフィールドのすべてのビットを割り当てなくても、コンパイラは指定されたデータ型に合わせて構造のサイズを決定しますunsignedunsigned int

したがって、32ビットint(Visual C ++のデフォルト)を想定すると、ユニオンの最初の構造は次のようになります。

struct
{
    unsigned int command:15;
    unsigned int acknowledge:1;
    unsigned int __unused:16;
};

これは4バイトです。unsigned short 2バイトだけにしたい場合は、最初の構造でを使用します。

struct
{
    unsigned short command:15;
    unsigned short acknowledge:1;
};
于 2013-01-06T00:37:47.493 に答える
2

これは、コンパイラオプションが原因です。新しいコンパイラは、メモリの調整を行います。これは、ユニオン/構造のサイズにも影響します。のようないくつかの実用的な解決策があります#pragma pack。以下のコードを参照して試してください。

#pragma pack(push, 1)
typedef union
{
    struct
    {
        unsigned command:15;
        unsigned acknowledge:1;
    };
    struct
    {
        unsigned short uicommand;
    };
    struct
    {
        Byte command_bytes[2];
    };
}TCOMMAND;
#pragma pack(pop)

push, 1ブロックを1バイトに整列するようにコンパイラーに指示します。これは古いコンパイラのデフォルト値でしたが、おそらく新しいコンパイラで変更されました。

于 2013-01-06T00:40:07.837 に答える
2

unsigned intが 4 バイトのアラインメントを持っているためかもしれません。コマンドおよび確認メンバーにunsigned shortを使用すると、構造体は 2 バイトの大きさになります。

于 2013-01-06T00:30:09.320 に答える