13

ブール値が 1 バイト (8 ビット長) であることは知っていますが、そのバイナリ表現が何であるかを知りたいです。例: 10 進数 => 2 進数 4 => 100 (0000 0100) 8 => 1000 (0000 1000) ブール値 => ???

4

5 に答える 5

20

boolC#に組み込まれている基本タイプです。基礎となる表現は、実装の詳細になります。

C#4.0言語仕様では、セクション4.1.8に次のように記載されています。

boolタイプはブール論理量を表します。typeの可能な値はとboolです。truefalse

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#コンパイラがboolC#のaを別のものにマップすることを決定した場合でも、C#コードのセマンティクスは同じです。

于 2010-07-26T14:39:50.500 に答える
8

現在のプラットフォームで が実行されている場合に、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);
}
于 2010-07-26T14:46:39.097 に答える
5

私は0xA3の答えと矛盾していませんが、使用する場合:

BitConverter.GetBytes(true);
BitConverter.GetBytes(false);

{ 1 }とのバイト配列を取得します{ 0 }。つまり、バイナリ値は と に00000001なり00000000ます。

これは、.NET がメモリ内でブール値を処理する方法を意味するものではありません。単にブール値をバイト配列に変換する方法です。

于 2010-07-26T14:48:55.050 に答える
0

ほとんどすべての言語/環境 (.NET だけでなく)trueは、整数値 1 と同等でありfalse、0 と等しいものとして実装されます。 1)

ただし、重要な例外が 1 つあります。VB6 はtrue-1 でした。これにより、.NET への移行がかなり困難になりました。VB6 の緩い型システムでは、同じ式で整数とブール値を混在させることができ2 And True、VB6 では VB.NET とは別の意味を持っていたためです。


1)多くのシステムでは、0 以外の任意の数値をtrueブール値のコンテキストに暗黙的に変換できます。いくつかの (特に動的な) 言語はさらに進んで、特別なオブジェクト (たとえばNone、空の配列、リストが続くなど) を除くすべてのオブジェクトが等しいと言いますtrue

于 2010-07-26T14:38:55.100 に答える
0

通常、値はすべてゼロでBoolean表され、それ以外の値になります。簡単にするために、これは通常、 2 の補数により -1 (符号付き整数型のすべてのビット)です。falsetrue

于 2010-07-26T14:54:23.223 に答える