ブール値が 1 バイト (8 ビット長) であることは知っていますが、そのバイナリ表現が何であるかを知りたいです。例: 10 進数 => 2 進数 4 => 100 (0000 0100) 8 => 1000 (0000 1000) ブール値 => ???
5 に答える
bool
C#に組み込まれている基本タイプです。基礎となる表現は、実装の詳細になります。
C#4.0言語仕様では、セクション4.1.8に次のように記載されています。
bool
タイプはブール論理量を表します。typeの可能な値はとbool
です。true
false
bool
と他のタイプの間には標準の変換はありません。特に、bool
型は整数型とは区別され、分離されておりbool
、整数値の代わりに値を使用することはできません。その逆も同様です。CおよびC++言語では、ゼロ整数値または浮動小数点値、またはnullポインターをブール値に変換でき
false
、非ゼロ整数値または浮動小数点値、または非nullポインターをに変換できます。ブール値true
。C#では、このような変換は、整数値または浮動小数点値をゼロと明示的に比較するか、オブジェクト参照をnullと明示的に比較することによって実現されます。
これを1レベル深くして、対応する型が共通中間言語(CIL)でどのように指定されているかを見ると、CLIブール型がメモリ内で1バイトを占めていることがわかります。共通言語基盤(CLI)仕様は、パーティションIIIのセクション1.1.2に次のように記載されています。
CLIブール型はメモリ内で1バイトを占有します。すべてゼロのビットパターンは、falseの値を示します。1つ以上のビットが設定されたビットパターン(ゼロ以外の整数に類似)は、trueの値を示します。
ただし、これは別のレベルで指定されており、C#内からは気にする必要はありません。CLI仕様の将来のバージョンでブール型の表現が変更される可能性がある場合、またはC#コンパイラがbool
C#のaを別のものにマップすることを決定した場合でも、C#コードのセマンティクスは同じです。
現在のプラットフォームで が実行されている場合に、bool
の基本的な表現を示す簡単なコードを次に示します。
var x = new NotAGoodIdea();
x.TheBool = true;
Console.WriteLine(x.TheByte); // 1
x.TheBool = false;
Console.WriteLine(x.TheByte); // 0
// ...
[StructLayout(LayoutKind.Explicit)]
public struct NotAGoodIdea
{
[FieldOffset(0)]
public bool TheBool;
[FieldOffset(0)]
public byte TheByte;
}
(を表している1
ように見え、 を表しtrue
ている0
ように見えますがfalse
、これは単なる実装の詳細であることに注意してください。この詳細に依存したり、異なるバージョンや実装間で一貫性が保たれると仮定したり、現在のプラットフォームが常に同じ一貫した表現を使用します。)
編集...
ECMA CLI 仕様Boolean
(パーティション III、セクション 1.1.2) は、型の許容される表現について非常に明確です。
1.1.2 ブールデータ型
CLI ブール型は、メモリ内で 1 バイトを占有します。すべてゼロのビット パターンは、偽の値を示します。1 つまたは複数のビットが設定されたビット パターン (ゼロ以外の整数に類似) は、真の値を示します。
現在の Microsoft CLR は、true
. 次の例では、1 行の "False" 行 ( 0
) に続いて 255 行の "True" が表示されます。
// re-use the NotAGoodIdea struct from the previous example
var x = new NotAGoodIdea();
for (int i = 0; i < 256; i++ )
{
x.TheByte = (byte)i;
Console.WriteLine(x.TheBool);
}
私は0xA3の答えと矛盾していませんが、使用する場合:
BitConverter.GetBytes(true);
BitConverter.GetBytes(false);
{ 1 }
とのバイト配列を取得します{ 0 }
。つまり、バイナリ値は と に00000001
なり00000000
ます。
これは、.NET がメモリ内でブール値を処理する方法を意味するものではありません。単にブール値をバイト配列に変換する方法です。
ほとんどすべての言語/環境 (.NET だけでなく)true
は、整数値 1 と同等でありfalse
、0 と等しいものとして実装されます。 1)
ただし、重要な例外が 1 つあります。VB6 はtrue
-1 でした。これにより、.NET への移行がかなり困難になりました。VB6 の緩い型システムでは、同じ式で整数とブール値を混在させることができ2 And True
、VB6 では VB.NET とは別の意味を持っていたためです。
1)多くのシステムでは、0 以外の任意の数値をtrue
ブール値のコンテキストに暗黙的に変換できます。いくつかの (特に動的な) 言語はさらに進んで、特別なオブジェクト (たとえばNone
、空の配列、リストが続くなど) を除くすべてのオブジェクトが等しいと言いますtrue
。
通常、値はすべてゼロでBoolean
表され、それ以外の値になります。簡単にするために、これは通常、 2 の補数により -1 (符号付き整数型のすべてのビット)です。false
true