c#中布尔值的二进制表示forms是什么

我知道布尔值是1个字节(8位长)但我想知道它的二进制表示是什么。 例如decimal => binary 4 => 100(0000 0100)8 => 1000(0000 1000)bool值=> ???

bool是C#中内置的基本类型。 任何底层表示都是实现细节。

C#4.0语言规范在4.1.8节中说明:

bool类型表示布尔逻辑量。 bool类型的可能值是truefalse

bool和其他类型之间不存在标准转换。 特别地, bool类型是不同的并且与整数类型分开,并且不能使用bool值代替整数值,反之亦然。

在C和C ++语言中,零积分或浮点值或空指针可以转换为布尔值false ,并且可以转换非零积分或浮点值或非空指针到布尔值为true 。 在C#中,通过显式地将整数或浮点值与零进行比较,或者通过显式地将对象引用与null进行比较来完成此类转换。

如果我们更深入地了解这一级别并查看如何在通用中间语言 (CIL)中指定相应的类型,我们将看到CLI布尔类型在内存中占用1个字节。 公共语言基础结构 (CLI)规范在分区III第1.1.2节中说明:

CLI布尔类型在内存中占用1个字节。 全零的位模式表示值false。 设置任何一个或多个位的位模式(类似于非零整数)表示值true。

但是,这是在另一个级别指定的,在C#中你不应该关心; 即使CLI规范的未来版本可能会更改布尔类型的表示forms,或者C#编译器决定将C#中的bool映射到不同的东西,您的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似乎表示为true0似乎表示为false ,但这只是一个实现细节。您不应该依赖此细节,或者假设它将在不同版本和/或实现中保持一致,甚至是当前平台始终使用相同的一致表示。)

编辑…

ECMA CLI规范 (分区III,第1.1.2节)非常清楚Boolean类型的允许表示:

1.1.2布尔数据类型

CLI布尔类型在内存中占用1个字节。 全零的位模式表示值false。 设置任何一个或多个位的位模式(类似于非零整数)表示值true。

看来当前的Microsoft CLR遵循ECMA规范允许多个表示为true 。 以下示例显示单个“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 }的字节数组。 换句话说,二进制值将是0000000100000000

这并不意味着.NET如何处理内存中的布尔值 – 它只是将它们转换为字节数组的方式。

几乎所有语言/环境(不仅是.NET)都实现为等于积分值1,而false等于0。

但是,有一个重要的例外,即VB6,其true等于-1。 这为迁移到.NET带来了很多困难,因为VB6的松散类型系统允许在同一个表达式中混合整数和布尔值, 2 And True意味着VB6中的其他东西比VB.NET中的东西。


1)尽管许多系统允许在布尔上下文中将任何不等于0的数值隐式转换为true 。 一些(特别是动态的)语言甚至更进一步,并且说除了特殊对象之外的所有对象(例如None ,空数组,列表继续……) true

通常, Boolean值由false表示为全零,而true为其他任何零。 为简单起见,由于Two的补码,这通常是-1(有符号整数类型的所有位)。