2016-01-11 7 views
5

最大のメンバーが32ビット整数である共用体を作成したいとします。これは主に書かれるものです。32ビット整数の差分スライスをそれぞれ参照する32ビットintと4つの8ビットchar型を持つ共用体を作成するにはどうすればよいですか?

union { 
    int32 myint; 
    char char1 [7:0]; 
    char char2 [15:8]; 
    char char3 [23:16]; 
    char char4 [31:24]; 
    } 

しかし、私はC++でこれを行う方法がわからないです。そして、おそらく4つの8ビット変数、それぞれが同様の32ビット整数種類の異なるセクションを参照します文字の種類があります。

+3

これはC++またはC用ですか? – Tas

+1

なぜ 'char'ですか? Bitfieldsはすでに 'int'に基づいています。 –

+0

私が書いたものは正しいC++ではありません。あなたはビットフィールドを意味するものを熟考できますか? char1にintをchar4に使用すると、上記の結合は構文的に正しいと言いますか? – quantum231

答えて

4

使用すると、1つの32bitのinterger 4つの8ビット変数や4つの8ビットの変数に分割interger 1つの32ビットを望んでいた場合、私は理解しませんでしたが、とにかくあなたはこのような何か試してみてください:

union yourUnion { 
    int32 yourInt; 
    struct { 
     int32 var1 : 8; 
     int32 var2 : 8; 
     int32 var3 : 8; 
     int32 var4 : 8; 
    } yourSplitInterger; 
}; 

はそれが役に立てば幸いです。

+0

はい、私はそれを分けようとしていました。これで十分です。 – quantum231

+0

ビットフィールドが単一の 'int32'に格納されるという保証はありません。各フィールドにも署名があります。 – Olaf

+0

[cppreference](http://en.cppreference.com/w/c/language/bit_field)によると、通常、ビットファイルは一緒にパックされているので、実際には、それらが単一の ' int32'ですが、私はそれがOPが何をしたいのかのベストプラクティスだと思います。また、フィールドが署名されているという事実は、OPがこれらのビット・フィールドに「char」を書き込む可能性があることを考慮すると、本当に重要なものではない。 – Maxattak

5

これは動作可能性があります

union { 
    int32 myint; 
    char chars[4]; 
}; 
+0

「char」は受け入れられた答えより優れていますが、オクテットとして定義されていないため、問題があります。また、署名されていても署名されていなくてもよい。 – Olaf

3

あなたはこれを使用することができます:

union myUnion { 
    int32 myint; 
    struct { 
     char char1; 
     char char2; 
     char char3; 
     char char4; 
    } myChars; // optional name 
}; 

hereを参照してください。

+3

':8'は余計です –

+0

@CaptainObvlious - Euh ..もちろんそうです - ビットフィールドについて考えていました。 –

2
union intBytes { 
    int32 myInt; 
    struct { 
     char char1; 
     char char2; 
     char char3; 
     char char4; 
    }; 
    char charArray[4]; 
}; 

intBytes dummy; 

あなたはchar1ラップ構造体ことを確認の上 - char4に名前が割り当てられていません。これはanonymous structと呼ばれます。無名の構造体のメンバーは、の範囲内で直接アクセス可能です。構造体です。

構造体なしの場合char1 - char4は共用体内で重複し、すべてがmyIntの最初のバイトを参照します。無名の構造体は、char1 - charが確実に連続してレイアウトされるようにします。

Cには匿名の構造体と共用体があります。 C++(pre C++ 11)は匿名の構造体を許可せず、匿名の共用体だけが定義されています。しかし、ほとんどのC++コンパイラ(llvm、gcc)では、匿名の構造体/共用体が許可されています。

C++で無名の構造体がC++に追加されました。

dummy.char4にアクセスできますが、通常はdummy.nameOfCharStruct.char4と入力する必要があります。これは標準に準拠していないので、C++(私はそれがpost C++ 03 Standatdで変更されたと信じています)、構造体の名前を追加するか、配列の手法を使うほうがよいでしょう。

+0

匿名 'struct'sと' union'sはC標準の一部です。 C++でも許可されているかどうかはわかりません。 – Olaf

+0

@Olaf:CとほとんどのC++コンパイラは微妙ですが、C++では匿名の構造体が許可されていないのに対し、匿名の構造体は大丈夫です。ここに参照がある(私はすべてのポイントに同意しない)http://stackoverflow.com/a/12785369/258418 – ted

+0

私はC++を気にしない。 Cについては、私は明確な参照を提供しました。しかし、私は "ほとんどのCコンパイラ"には注意が必要です。 MSVCのような多くのC90専用コンパイラーまたはそれ以外の非標準コンパイラーがまだあります。しかし、標準準拠のCコンパイラ**はそれらをサポートする必要があります。この標準では、匿名の 'struct'sと' union'sの両方を新しいフィーチャーとしてリストアップしていますので、おそらくC99は何もサポートしていませんでした(リンクされた答えは間違っているようです。 gccは拡張機能として長い時間サポートしていました。 – Olaf

関連する問題