C言語構造体が定義されている場合、各メンバーの後ろにコロンを付けるのはどういう意味ですか?
ビットドメインとは、情報が格納されている間に、完全なバイトを占有する必要がなく、数または1つのバイナリビットを占有する必要があることを意味します.例えば、1つのスイッチング量を格納する場合、0と1の2つの状態だけで、1ビットの2進位でよい.記憶領域を節約し、処理を簡便にするために、C言語は「ビットドメイン」または「ビットセグメント」と呼ばれるデータ構造を提供する.「ビットドメイン」とは、1バイトのバイナリビットをいくつかの異なる領域に分割し、各領域のビット数を説明するものである.各ドメインにはドメイン名があり、プログラム内でドメイン名で操作できます.これにより,いくつかの異なるオブジェクトを1バイトのバイナリビットドメインで表すことができる.
中国語名
ビットドメイン
けいしき
structビットドメイン構造名
とくてん
構造変数の説明と同じ方法
目の
ストレージスペースを節約するために
目次 1ビットドメインの定義とビットドメイン変数の説明 ▪ビットドメイン定義 ▪ビットドメイン変数の説明 ▪ビットドメイン定義のいくつかの説明 ビットドメインの使用及び占有空間 ▪ビットドメインの使用 ▪ビットドメインの位置合わせ 3ビットドメインのシンボル特性 ビットドメインの定義とビットドメイン変数の説明
編集
ビットドメイン定義
構造定義と似ています.形式は次のとおりです.
structビットドメイン構造名
{ビットドメインリスト};
ここで、ビットドメインリストの形式は、タイプ説明子ビットドメイン名:ビットドメイン長
例:
struct bs
{int a:8;int b:2;int c:6;};
ビットドメイン変数の説明
構造変数の説明と同じです.先に定義してから説明し、同時に説明を定義したり、直接説明したりする3つの方法を採用することができます.例:
struct bs
{int a:8;int b:2;int c:6;}data;
説明dataはbs変数で、2バイトを占めています.ここで、ビットドメインaは8ビット、ビットドメインbは2ビット、ビットドメインcは6ビットを占める.
ビットドメイン定義のいくつかの説明
ビットドメインの定義については、以下の説明があります.
1.幅が0の名前のないビットドメインは、次のtype境界に位置合わせさせます.typeはメンバーのタイプです.例:
VC 6(デフォルトの構成で、最適化の選択は行われていません)による空域の処理.
実験では,0 x 001 2 ff 74は変数dataの開始アドレスであり,ビットドメインaは0 x 001 2 ff 74の後4ビットを充填し,ビットドメインbは0 x 001 2 ff 78から0 x 012 ff 78の後4ビットを占める.従って、空域はaから4ビットの残りの部分を占めている.
一見VC 6の空域に対する処理は空域のタイプ,すなわちunsignedに基づいている.実はそうではありません.
試験により,空域が占める大きさとaのタイプと空域のタイプの両方が相関した.
すなわち、以下の4つの場合、
a,空域がcharの場合,両者は共に1バイトを占める.
aはunsigned、空域はunsignedである.aはcharであり、空域はunsignedである.aはunsigned、空域はcharである.この3つの場合,両者は4バイトを占めている.
2.ビットドメインの長さは、指定したタイプの固有長より大きくすることはできません.例えば、intのビットドメインの長さは32を超えてはいけません.boolのビットドメインの長さは8を超えてはいけません.
3.ビットドメインは、ビットドメイン名なしで使用できます.この場合、位置の入力または調整にのみ使用されます.無名のビットドメインは使用できません.例:
以上の解析から,ビットドメインは本質的に構造タイプであるが,そのメンバーはバイナリビットで割り当てられていることがわかる.
ビットドメインの使用と占有スペース
編集
ビットドメインの使用
ビットドメインの使用は、構造メンバーの使用と同じであり、一般的には、ビットドメイン変数名・ビットドメイン名ビットドメインが様々なフォーマットで出力できるようにします.
上記の例のプログラムでは、ビットドメイン構造bsが定義され、3つのビットドメインはa,b,cである.bsタイプの変数bitとbsタイプを指すポインタ変数pbitについて説明した.これは、ビットドメインもポインタを使用できることを示します.
プログラムの9,10,11の3行はそれぞれ3つのビットドメインに値を付与する.(このビットドメインの許容範囲を超えてはならないことに注意してください)プログラム12行目は、3つのドメインの内容を整数形式で出力します.13行目はビットドメイン変数bitのアドレスをポインタ変数pbitに送る.14行目はポインタ方式でビットドメインaに値を再付与し、0に付与する.15行目には、pbit->b=pbit->b&3ビットドメインbの値が7であり、3とビットと演算された結果が3(111&011=011、10進数値が3)に相当する複合ビット演算子「&=」が使用される.同様に,プログラム16行目に複合ビット演算"|="が用いられ,pbit->c=pbit->c|1の結果が15であることに相当する.プログラム17行目はポインタ方式でこの3つのドメインの値を出力した.
スペースを節約するために、いくつかのデータを少数のいくつかのタイプの空間に圧縮することができ、例えば2つの3ビットのバイナリの数、1つの2ビットのバイナリの数を表す必要がある場合、1つの8ビットの文字で表すことができます.
この構造体が占める空間は1バイト,8ビットである.スペースを節約しました.
ビットフィールドの位置合わせ
構造体にビットドメイン(bit-field)が含まれている場合、VCのガイドラインは次のとおりです.
1)隣接するビットフィールドのタイプが同じで、そのビット幅の和がタイプのsizeofサイズより小さい場合、後続のフィールドは前のフィールドに隣接して格納され、収容できないまで格納される.
2)隣接するビットフィールドのタイプが同じで、そのビット幅の和がタイプのsizeofサイズより大きい場合、後続のフィールドは新しいメモリセルから始まり、そのオフセット量はタイプサイズの整数倍になる.
3)隣接するビットドメインフィールドのタイプが異なる場合、各コンパイラの具体的な実装に差があり、VC 6は非圧縮方式(異なるビットドメインフィールドは異なるビットドメインタイプバイトに格納される)を採用し、Dev-C++とGCCはいずれも圧縮方式を採用する.
システムは、まず構造体メンバーにスペースとフィルタを配置し、変数をビットドメイン操作します.
ビットドメインのシンボル特性
編集
ビットドメインのシンボル特性は,ビットドメイン変数の正または負の問題である.符号型を用いてビットドメインを定義し,判定条件として正負(意図的または意図的)特性を用いた場合に問題がある.
上記のプログラムの出力は-1-2 3である.私たちが予想した1,2,3とは違います.有符号数は機械には補符号の形で存在し,その正負の判断にはその規則がある.ビットドメインは,元のコードの形式で動作し,その間に差があり,上記の結果をもたらした.ビットドメインの正負数判断についても,単純なヘッダbitの0または1では決定されないが,上記の結果は−1−2−3または1 2 3であるべきである.ビットドメインの実装は、コンパイラに関連しています.ビットドメインを使用するには、正負のような特性を使用しないことをお勧めします.理論的には、定義されたbitの0または1だけに注目すべきで、記号がありません.もちろん、上記のような印刷でも正負の特性は使用されていません.これが無意識のうちに正負の特性を用いたものである.符号なしタイプを使用してビットドメインを定義できます.これにより、正負記号のような問題は発生しません.
中国語名
ビットドメイン
けいしき
structビットドメイン構造名
とくてん
構造変数の説明と同じ方法
目の
ストレージスペースを節約するために
目次
編集
ビットドメイン定義
構造定義と似ています.形式は次のとおりです.
structビットドメイン構造名
{ビットドメインリスト};
ここで、ビットドメインリストの形式は、タイプ説明子ビットドメイン名:ビットドメイン長
例:
struct bs
{int a:8;int b:2;int c:6;};
ビットドメイン変数の説明
構造変数の説明と同じです.先に定義してから説明し、同時に説明を定義したり、直接説明したりする3つの方法を採用することができます.例:
struct bs
{int a:8;int b:2;int c:6;}data;
説明dataはbs変数で、2バイトを占めています.ここで、ビットドメインaは8ビット、ビットドメインbは2ビット、ビットドメインcは6ビットを占める.
ビットドメイン定義のいくつかの説明
ビットドメインの定義については、以下の説明があります.
1.幅が0の名前のないビットドメインは、次のtype境界に位置合わせさせます.typeはメンバーのタイプです.例:
struct bs {
unsigned a:4;
unsigned :0 ;/* */
char b:4 ;/* */
unsigned c:4;
}data;
VC 6(デフォルトの構成で、最適化の選択は行われていません)による空域の処理.
実験では,0 x 001 2 ff 74は変数dataの開始アドレスであり,ビットドメインaは0 x 001 2 ff 74の後4ビットを充填し,ビットドメインbは0 x 001 2 ff 78から0 x 012 ff 78の後4ビットを占める.従って、空域はaから4ビットの残りの部分を占めている.
一見VC 6の空域に対する処理は空域のタイプ,すなわちunsignedに基づいている.実はそうではありません.
試験により,空域が占める大きさとaのタイプと空域のタイプの両方が相関した.
すなわち、以下の4つの場合、
a,空域がcharの場合,両者は共に1バイトを占める.
aはunsigned、空域はunsignedである.aはcharであり、空域はunsignedである.aはunsigned、空域はcharである.この3つの場合,両者は4バイトを占めている.
2.ビットドメインの長さは、指定したタイプの固有長より大きくすることはできません.例えば、intのビットドメインの長さは32を超えてはいけません.boolのビットドメインの長さは8を超えてはいけません.
3.ビットドメインは、ビットドメイン名なしで使用できます.この場合、位置の入力または調整にのみ使用されます.無名のビットドメインは使用できません.例:
struct k
{int a:1int :2 /* 2 */int b:3int c:2};
以上の解析から,ビットドメインは本質的に構造タイプであるが,そのメンバーはバイナリビットで割り当てられていることがわかる.
ビットドメインの使用と占有スペース
編集
ビットドメインの使用
ビットドメインの使用は、構造メンバーの使用と同じであり、一般的には、ビットドメイン変数名・ビットドメイン名ビットドメインが様々なフォーマットで出力できるようにします.
int main(void)
{
struct bs
{
unsigned a: 1;
unsigned b: 3;
unsigned c: 4;
}bit, *pbit;
bit.a = 1;
bit.b = 7;
bit.c = 15;
printf("%d,%d,%d
", bit.a, bit.b, bit.c);
pbit = &bit;
pbit->a = 0;
pbit->b &= 3;
pbit->c |= 1;
printf("%d,%d,%d
", pbit->a, pbit->b, pbit->c);
return 0;
}
上記の例のプログラムでは、ビットドメイン構造bsが定義され、3つのビットドメインはa,b,cである.bsタイプの変数bitとbsタイプを指すポインタ変数pbitについて説明した.これは、ビットドメインもポインタを使用できることを示します.
プログラムの9,10,11の3行はそれぞれ3つのビットドメインに値を付与する.(このビットドメインの許容範囲を超えてはならないことに注意してください)プログラム12行目は、3つのドメインの内容を整数形式で出力します.13行目はビットドメイン変数bitのアドレスをポインタ変数pbitに送る.14行目はポインタ方式でビットドメインaに値を再付与し、0に付与する.15行目には、pbit->b=pbit->b&3ビットドメインbの値が7であり、3とビットと演算された結果が3(111&011=011、10進数値が3)に相当する複合ビット演算子「&=」が使用される.同様に,プログラム16行目に複合ビット演算"|="が用いられ,pbit->c=pbit->c|1の結果が15であることに相当する.プログラム17行目はポインタ方式でこの3つのドメインの値を出力した.
スペースを節約するために、いくつかのデータを少数のいくつかのタイプの空間に圧縮することができ、例えば2つの3ビットのバイナリの数、1つの2ビットのバイナリの数を表す必要がある場合、1つの8ビットの文字で表すことができます.
struct
{char a : 3;char b : 3;char c : 2;} ;
この構造体が占める空間は1バイト,8ビットである.スペースを節約しました.
ビットフィールドの位置合わせ
構造体にビットドメイン(bit-field)が含まれている場合、VCのガイドラインは次のとおりです.
1)隣接するビットフィールドのタイプが同じで、そのビット幅の和がタイプのsizeofサイズより小さい場合、後続のフィールドは前のフィールドに隣接して格納され、収容できないまで格納される.
2)隣接するビットフィールドのタイプが同じで、そのビット幅の和がタイプのsizeofサイズより大きい場合、後続のフィールドは新しいメモリセルから始まり、そのオフセット量はタイプサイズの整数倍になる.
3)隣接するビットドメインフィールドのタイプが異なる場合、各コンパイラの具体的な実装に差があり、VC 6は非圧縮方式(異なるビットドメインフィールドは異なるビットドメインタイプバイトに格納される)を採用し、Dev-C++とGCCはいずれも圧縮方式を採用する.
システムは、まず構造体メンバーにスペースとフィルタを配置し、変数をビットドメイン操作します.
ビットドメインのシンボル特性
編集
ビットドメインのシンボル特性は,ビットドメイン変数の正または負の問題である.符号型を用いてビットドメインを定義し,判定条件として正負(意図的または意図的)特性を用いた場合に問題がある.
#include
using namespace std;
class test
{
public:
test(int i1,int j1,int k1)
{
i = i1;
j = j1;
k = k1;
}
int i:1;
int j:2;
int k:13;
};
int main (){
test t((int)1,(int)2,(int)3);
cout<
上記のプログラムの出力は-1-2 3である.私たちが予想した1,2,3とは違います.有符号数は機械には補符号の形で存在し,その正負の判断にはその規則がある.ビットドメインは,元のコードの形式で動作し,その間に差があり,上記の結果をもたらした.ビットドメインの正負数判断についても,単純なヘッダbitの0または1では決定されないが,上記の結果は−1−2−3または1 2 3であるべきである.ビットドメインの実装は、コンパイラに関連しています.ビットドメインを使用するには、正負のような特性を使用しないことをお勧めします.理論的には、定義されたbitの0または1だけに注目すべきで、記号がありません.もちろん、上記のような印刷でも正負の特性は使用されていません.これが無意識のうちに正負の特性を用いたものである.符号なしタイプを使用してビットドメインを定義できます.これにより、正負記号のような問題は発生しません.