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

emm*_*emm 13 c# binary boolean representation bit

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

Dir*_*mar 20

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

C#4.0语言规范第4.1.8规定:

bool类型表示布尔逻辑量.类型的可能值booltruefalse.

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

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

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

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

但是,这是在另一个级别指定的,在C#中你不应该关心; 即使CLI规范的未来版本可能会更改布尔类型的表示形式,或者C#编译器决定将C#映射bool到不同的东西,您的C#代码仍将具有相同的语义.


Luk*_*keH 7

以下是一个演示的底层表示的代码快速位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;
}
Run Code Online (Sandbox Code Playgroud)

(请注意,尽管1似乎代表true并且0似乎代表false,但这只是一个实现细节.您不应该依赖于此细节,或者假设它将在不同版本和/或实现中保持一致,或者甚至是当前平台始终保持一致使用相同的一致表示.)

编辑...

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

1.1.2布尔数据类型

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

看来当前的Microsoft CLR遵循ECMA规范允许多个表示true.以下示例显示单个"False"行(for 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);
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`object.Equals()`不会考虑两个内部不同的`bool`.可以说是一个带有`object.Equals()`的错误,当然不太可能提出合理的代码,但至少有一种情况是,当CLI规范认为是真的时,BCL却没有. (2认同)

Jon*_*n B 5

我并不反对0xA3的答案,但如果你使用:

BitConverter.GetBytes(true);
BitConverter.GetBytes(false);
Run Code Online (Sandbox Code Playgroud)

你会得到一个{ 1 }和的字节数组{ 0 }.换句话说,二进制值将是0000000100000000.

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


Kon*_*lph 1

几乎所有语言/环境(不仅是 .NET)都实现true为相当于整数值 1,并且false等于 0。

\n\n

然而,\xe2\x80\x99 有一个重要的例外,即 VB6,它等于true\xe2\x80\x931。这使得迁移到 .NET 变得相当困难,因为 VB6 的松散类型系统允许在同一表达式中混合整数和布尔值,并且在2 And TrueVB6 中意味着与 VB.NET 中不同的东西。

\n\n
\n\n

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

\n

  • 我认为C将0视为假,而将其他任何东西视为真? (5认同)
  • 在旧系统中,还使用-1 (0xffffff) 和0。 (3认同)