C言語ビットセグメントの詳細な紹介
C言語のビットセグメント
ビットフィールドは、構造体 (または共用体) 内のメンバー変数が占めるスペースをビット単位で定義します。ビットセグメントを含む構造(和集合)をビットセグメント構造と呼びます。分割構造により省スペースかつ操作性が向上します。
ビットフィールドの定義形式は次のとおりです:
type [var]:digits
type は int、unsigned int、signed のみです int には 3 つの型があります (int 型が負の数を表現できるかどうかはコンパイラによって異なります。たとえば、VC の int はデフォルトで signed になります) int は負の数を表すことができます)。ビット フィールド名 var はオプションのパラメータであり、省略できます。桁数は、このビット フィールドが占める 2 進数の桁数を表します。
次に、ビット セグメント構造の定義は、次のコードのように定義できます:
struct node { unsigned int a:4; //位段a,占4位 unsigned int :0; //无名位段,占0位 unsigned int b:4; //位段b,占4位 int c:32; //位段c,占32位 int :6; //无名位段,占6位 };
1. ビット セグメントの使用
ビット セグメントを使用する際に注意すべき点がいくつかあります:
1) ビット セグメントのタイプは、 unsigned int と signed int の 3 つのタイプがあり、char 型または浮動小数点型にすることはできません
2) ビットフィールドが占める 2 進数の桁数は、次の式で表現できる最大桁数を超えることはできません。たとえば、VC の int が 4 バイトを占める場合、最大でも 32 ビットしか使用できません
3) 名前のないビット フィールドにはアクセスできませんが、スペースを占有します。ビットフィールド用に取得されます
5) ビット フィールドが占める 2 進数の数が 0 の場合、このビット フィールドは名前のないビット フィールドでなければならず、次のビット フィールドは次のビット フィールド ストレージ ユニット (ここでのビット フィールド ストレージ ユニットの数) に格納されます。 VC 環境では 4 であることがテストされています) Byte) の保存が開始されます
6) 式にビット フィールドが出現すると、自動的に整数型にアップグレードされ、int 型または unsigned int に変換されます。
7) ビット セグメントに値を割り当てるときは、ビット セグメントが表現できる最大範囲を超えないことが最善です。そうしないと、予期しない結果が発生する可能性があります。
8) ビットフィールドを配列の形式にすることはできません。
2. ビット セグメント構造がメモリに格納される方法
ビット セグメント構造に関して、主な原則は次のとおりです。 1) ビット セグメント ストレージ ユニットが下位ビット セグメント構造内のすべてのメンバーを格納できる場合、ビット セグメント構造内のすべてのメンバーは 1 つのビット セグメント ストレージ ユニットにのみ配置でき、2 つのビット セグメント ストレージ ユニットに配置することはできません。 1 つのビット セグメント記憶ユニットが下位ビット セグメント構造内のすべてのメンバーを収容できない場合、残りのビット セグメントは次のビット セグメント記憶ユニットから記憶されます。 (VCのセグメント記憶ユニットのサイズは4バイトです)。
2) ビット セグメント構造内に 0 ビットを占有する名前のないビット セグメントが 1 つだけある場合、それは 1 バイトまたは 0 バイトのスペースのみを占有します (C 言語では 0 バイト、C++ では 1 バイト)。それ以外の場合は、次のようになります。ビットセグメント構造が占めるスペースは少なくともビットセグメントストレージユニットのサイズです。
テストプログラム:
/*测试位段 201110.12*/ #include<iostream> using namespace std; typedef struct node { unsigned int a:1; //存在一个非0位的位段,则至少占4Byte }S; typedef struct node1 //在C++中占1字节的空间 ,在C中占0字节 { unsigned int :0; }S1; typedef struct node2 { unsigned int a:1; unsigned int :0; //下一个位段放在一个新的位段存储单元 ,所以占4+4=8Byte unsigned c:32; }S2; typedef struct node3 { unsigned int a:4; unsigned int :0; int :6; //这个位段放在一个新的位段存储单元 unsigned c:32;//由于6+32>32,所位段c也放在一个新的位段存储单元,所以占4+4+4=12Byte }S3; typedef struct node4 { unsigned int a:1; char b; //在一个位段存储单元中能够存下所有的成员,所以占4Byte int c:1; int d:2; unsigned int e:2; }S4; nt main(int argc, char *argv[]) { S4 s4; s4.a=1; s4.c=1; s4.d=2; s4.e=3; printf("%d %d %d %d\n",s4.a,s4.c,s4.d,s4.e); printf("%d %d %d %d %d\n",sizeof(S),sizeof(S1),sizeof(S2),sizeof(S3),sizeof(S4)); return 0; }
実行結果:
1 -1 -2 3
4 1 8 12 4を押してください。
s4 の各ビットフィールドを出力すると、割り当てられた初期値とは異なります。
c は 1 ビットしか占有しないので、このとき、上位ビットに直接 1 を加算する符号拡張が実行されるため、出力結果は -1 になります。
d は 2 ビットを占有するため、次のようになります。 dに2が代入され、メモリに格納されている内容は10です。このとき符号拡張が行われ、上位ビットに1を補うと0XFF FF FF FEとなり、その真の値は-2になります
読んでいただきありがとうございます。皆さんのお役に立てれば幸いです。このサイトのサポートにご興味をお持ちいただきありがとうございます。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











c言語のシンボルの使用方法は、算術、割り当て、条件、ロジック、ビット演算子などをカバーします。算術演算子は基本的な数学的操作に使用されます。割り当てと追加、下位、乗算、除算の割り当てには、条件操作に使用されます。ポインター、ファイル終了マーカー、および非数値値。

Cでは、文字列でCharタイプが使用されます。1。単一の文字を保存します。 2。配列を使用して文字列を表し、ヌルターミネーターで終了します。 3。文字列操作関数を介して動作します。 4.キーボードから文字列を読み取りまたは出力します。

C言語では、以下などのエスケープシーケンスを通じて特殊文字が処理されます。\ nはラインブレークを表します。 \ tはタブ文字を意味します。 ESACEシーケンスまたは文字定数を使用して、Char C = '\ n'などの特殊文字を表します。バックスラッシュは2回逃げる必要があることに注意してください。さまざまなプラットフォームとコンパイラが異なるエスケープシーケンスを持っている場合があります。ドキュメントを参照してください。

マルチスレッドと非同期の違いは、マルチスレッドが複数のスレッドを同時に実行し、現在のスレッドをブロックせずに非同期に操作を実行することです。マルチスレッドは計算集約型タスクに使用されますが、非同期はユーザーインタラクションに使用されます。マルチスレッドの利点は、コンピューティングのパフォーマンスを改善することですが、非同期の利点はUIスレッドをブロックしないことです。マルチスレッドまたは非同期を選択することは、タスクの性質に依存します。計算集約型タスクマルチスレッド、外部リソースと相互作用し、UIの応答性を非同期に使用する必要があるタスクを使用します。

C言語では、charとwchar_tの主な違いは文字エンコードです。CharはASCIIを使用するか、ASCIIを拡張し、WCHAR_TはUnicodeを使用します。 Charは1〜2バイトを占め、WCHAR_Tは2〜4バイトを占有します。 charは英語のテキストに適しており、wchar_tは多言語テキストに適しています。 CHARは広くサポートされており、WCHAR_TはコンパイラとオペレーティングシステムがUnicodeをサポートするかどうかに依存します。 CHARの文字範囲は限られており、WCHAR_Tの文字範囲が大きく、特別な機能が算術演算に使用されます。

C言語では、charタイプの変換は、キャスト:キャスト文字を使用することにより、別のタイプに直接変換できます。自動タイプ変換:あるタイプのデータが別のタイプの値に対応できる場合、コンパイラは自動的に変換します。

Char Arrayは文字シーケンスをC言語で保存し、char array_name [size]として宣言されます。アクセス要素はサブスクリプト演算子に渡され、要素は文字列のエンドポイントを表すnullターミネーター「\ 0」で終了します。 C言語は、strlen()、strcpy()、strcat()、strcmp()など、さまざまな文字列操作関数を提供します。

CharおよびUnsigned Charは、文字データを保存する2つのデータ型です。主な違いは、負と正の数に対処する方法です:値範囲:char署名(-128〜127)、および符号なしのchar unsigned(0〜255)。負の数処理:charは負の数を保存でき、符号なしのcharはできません。ビットモード:char最高ビットは、シンボル、符号なしのchar unsignedビットを表します。算術操作:charおよびunsigned charが署名されており、署名されていないタイプがあり、それらの算術操作は異なります。互換性:charおよびunsigned char
