長さが 10 文字の .NET 文字列は何ビットですか? (.NET 文字列は UTF-16 ですよね?)
4 に答える
32 ビット システムの場合:
4 bytes = Type pointer (Every object has one of these)
4 bytes = Lock (One of these too!)
4 bytes = Length (Need the length)
2 * Length bytes = Data (And the chars themselves)
=======================
12 + 2*Length bytes
=======================
96 + 16*Length bits
したがって、10 文字 = 256 ビット= 32 バイト
Lock が 64 ビット システムで 64 ビットに拡張されるかどうかはわかりません。私はちょっと願っていませんが、あなたは決して知りません。したがって、64 ビット構造のオーバーヘッドは、16 ~ 20 バイトの範囲になります (32 ビットの 12 バイトとは対照的に)。
文字列内のすべての文字のサイズは 2 バイトであるため、特定のエンコーディングを使用せずに文字を直接変換する場合、答えは string.Length * 2 * 8 になります。
それ以外の場合、結果はエンコーディングに依存します。次のように記述できます。
int numbits = System.Text.Encoding.UTF8.GetByteCount(str)*8; //returns 80
また
int numbits = System.Text.Encoding.Unicode.GetByteCount(str)*8 //returns 160
純粋な Unicode-16 について話している場合は、次のようになります。
10 文字 = 20 バイト = 160 ビット
これには、適切に回答するためにコンテキストが必要です。
すべては、文字を定義する方法とデータを保存する方法にかかっています。
たとえば、ユーザーの観点から文字を 1 文字として定義する場合、2 バイトを超える可能性があります。たとえば、この文字: Å は 2 つの Unicode コード ポイント (U+0041 U+030A、ラテン大文字 A + 結合リング) です。上記) したがって、2 つの .net char または 4 バイトの int UTF-16 が必要になります。
10 個の .net Char 要素について話している場合でも、それがメモリ内にある場合よりも、オブジェクト オーバーヘッド (既に述べた) と少しのアライメント オーバーヘッド (32 ビット システムでは、すべてを 64 ビットで 4 バイト境界にアライメントする必要があります) があります。ルールはより複雑です) そのため、最後に空のバイトがいくつかある場合があります。
データベースまたはファイルについて話している場合、各データベースおよびファイル システムには独自のオーバーヘッドがあります。