0

#pragma pack(1)フィールドを定義し、6-bitそれを と仮定すると、間違った動作に行き詰まりました8-bitこの質問を読んで問題を解決しましたが、まったく役に立ちません。

Visual Studio 2012では、文字structを保存するために次のように定義しました。Base64

#pragma pack(1)
struct BASE64 {
    CHAR    cChar1 : 6;
    CHAR    cChar2 : 6;
    CHAR    cChar3 : 6;
    CHAR    cChar4 : 6;
};

でサイズを取得しましsizeofたが、結果は期待したものではありません:

printf("%d", sizeof(BASE64));      // should print 3

結果 :4

私はそれが得られることを期待していました3(なぜなら6 * 4 = 2424ビットは3バイトだからです)

1-bit代わりにフィールドでテストし、正しいサイズ(1バイト)を得たイベント:

#pragma pack(1)
struct BASE64 {
    CHAR    cChar1 : 2;
    CHAR    cChar2 : 2;
    CHAR    cChar3 : 2;
    CHAR    cChar4 : 2;
};

実際、なぜ6-bitと仮定する8-bit#pragma pack(1)ですか?

4

3 に答える 3

2

一部の実装では、ビット フィールドは変数の境界をまたぐことができません。変数内に複数のビット フィールドを定義できるのは、それらの合計ビット数がその変数のデータ型内に収まる場合のみです。

最初の例では、両方をCHAR保持するのに十分な利用可能なビットがありません。それぞれが6ビットであるため、次のメモリに移動する必要があります。とと同じです。したがって、の合計サイズが3 バイトではなく 4 バイトである理由:cChar1cChar2cChar2CHARcChar3cChar4BASE64

  (6 bits + 2 bits padding) = 8 bits
+ (6 bits + 2 bits padding) = 8 bits
+ (6 bits + 2 bits padding) = 8 bits
+ 6 bits
- - - - - - - - - - 
= 30 bits
= needs 4 bytes

2 番目の例では、aには、それぞれ 1 ビットのときに...CHARのすべてを保持するのに十分な利用可能なビットがあります。したがって、の合計サイズが4 バイトではなく 1 バイトである理由:cChar1cChar4BASE64

  1 bit
+ 1 bit
+ 1 bit
+ 1 bit
- - - - - - - - - - 
= 4 bits
= needs 1 byte
于 2018-08-21T07:20:55.027 に答える