1

私は次のコードにかなり困惑しています:

typedef struct
{
    Uint16          first:8;   // has a size of 8 bit
    Uint16          second:8;  // has a size of 8 bit
    Uint16          third;     // has a size of 32 bit; what's wrong here?
} TSomeStruct;

「3番目」のサイズは32ビットではなく16ビットになると予想していました。間違いは私の側にあるに違いないと確信しています。

背景: これは私のコード ベースではなく、検証を行っています。組み込みシステムと私が持っていない独自のコンパイラ用に書かれているため、「-fdump-translation-unit」オプションを使用して構文ツリーを生成し、それに対して検証を実行します。しかし、Uint16 は GCC でも 16 ビット長である必要があるため、問題にはなりませんよね?

4

2 に答える 2

2

Uint16は C の標準型ではないため、そのサイズはtypedef編集内容によって異なります。

組み込みプラットフォーム向けの専用コンパイラでは 16 ビットであることが保証されているため、typedef修正される可能性があります。unsigned intただし、x86 プラットフォーム用の現在の gcc でコンパイルすると、32 ビット型になります。

gcc に 32 ビットではなく 16 ビットを使用させる方法はありますintか?

私は何も知らない。コードにアクセスできる場合は、short代わりに使用するintとうまくいく可能性が非常に高くなります。が利用可能な場合stdint.huint16_t/int16_tは機能します (プラットフォームに 16 ビット整数型がない場合を除きます)。

于 2013-02-21T14:14:32.520 に答える
2

構造体のメンバーは通常、ワード サイズにパディングされます。

コンパイラに構造体を強制的にパックさせるには、さまざまな方法があります。私は次のことを好みます:

struct __attribute__((__packed__)) packed_struct {
    unsigned char a;
    unsigned char b;
    unsigned char c;
};

この場合sizeof(packed_struct)、 が得られます3

残念ながら、これはプログラムのパフォーマンスによって支払われます。

于 2013-02-21T13:30:02.503 に答える