LCDヒータッチディスプレイパラレルポート接続をモデル化しています(興味のあるHD44780、4ビットモード用)。私は1に整列していても、この連合が2バイトを占める理由
アラインメントが1に設定されていても、このユニオンは引き続き2バイトを占有します。私がmsnibble構造体を取り除くと(db4をdb7に直接結合体内の構造体に置く)、それは1バイトを占有します。構造体が共用体内にある場合、構造体は1バイト未満を取ることができますか? 2バイトは、1バイトにニブル(有効ビット、rsビット、2つの空白ビット)を加えて、サイズが2バイトになるというmsnibbleの結果ですか?
ここでコードは次のとおりです。
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
typedef uint8_t byte_t;//could have used char
#pragma pack(push,1)
typedef union
{
byte_t whole_port :8;
struct
{
byte_t enable :1;
byte_t rs :1;
byte_t :1;
byte_t :1;
struct
{
byte_t db4 :1;
byte_t db5 :1;
byte_t db6 :1;
byte_t db7 :1;
}msnibble;
};
} para_port_t;
#pragma pack(pop)
int main(int argc, char** argv) {
printf("%u\n",sizeof(para_port_t));
return (EXIT_SUCCESS);
}
私はgccでコンパイルするのUbuntuでのNetBeansから働いています。プラグマはコンパイラディレクティブなので、私はそれがMicrosoft Visual Studioで同じかどうかを知りたがっていますか?
'typedef uint8_t byte_t; // char'〜を使用した場合、 'unsigned char'を使用する可能性があります。 –
私はここで何か愚かなことをしようとしていると思う:http://stackoverflow.com/q/11326460/1566187 – Elyasin
'1バイトにニブルを加えたmsnibbleの結果である2バイトですか(イネーブルビット、rsビットと2つの空白ビット)、サイズ2バイトを作る?はい、私は標準を参照することはできませんが、この内部構造体は追加のバイトを使用するように見えます –