13

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

4

5 回答 5

20

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

C# 4.0 语言规范在第4.1.8 节中指出:

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

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

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

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

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

但是,这是在另一个级别上指定的,并且在 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似乎代表true0似乎代表false,但这只是一个实现细节。您不应依赖此细节,或假设它在不同版本和/或实现之间保持一致,甚至当前平台始终使用相同的一致表示。)

编辑...

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

1.1.2 布尔数据类型

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

当前的 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);
}
于 2010-07-26T14:46:39.097 回答
5

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

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

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

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

于 2010-07-26T14:48:55.050 回答
0

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

于 2010-07-26T14:54:23.223 回答
0

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

但是,有一个重要的例外,即 VB6,它true等于 –1。这给迁移到 .NET 带来了很多困难,因为 VB6 的松散类型系统允许在同一个表达式中混合整数和布尔值,并且2 And True在 VB6 中的含义与在 VB.NET 中不同。


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

于 2010-07-26T14:38:55.100 回答