我知道一个布尔值是 1 个字节(8 位长)但我想知道它的二进制表示是什么。例如十进制 => 二进制 4 => 100 (0000 0100) 8 => 1000 (0000 1000) 布尔值 => ???
5 回答
bool
是 C# 中的内置基本类型。任何底层表示都将是实现细节。
C# 4.0 语言规范在第4.1.8 节中指出:
该
bool
类型表示布尔逻辑量。bool
type的可能值为true
和false
。
bool
与其他类型之间不存在标准转换。特别是,bool
类型与整数类型不同且分开,并且bool
不能使用值代替整数值,反之亦然。在 C 和 C++ 语言中,可以将零整数或浮点值或空指针转换为布尔值
false
,并且可以将非零整数或浮点值或非空指针转换为布尔值true
。在 C# 中,此类转换是通过显式将整数或浮点值与零进行比较,或通过将对象引用显式与 null 进行比较来完成的。
如果我们更深入地了解这一层并查看在通用中间语言(CIL) 中如何指定相应的类型,我们将看到 CLI 布尔类型在内存中占用 1 个字节。公共语言基础结构(CLI) 规范在第III 部分第 1.1.2 节中说:
CLI 布尔类型在内存中占用 1 个字节。全为零的位模式表示值为假。设置了任何一个或多个位的位模式(类似于非零整数)表示值为真。
但是,这是在另一个级别上指定的,并且在 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 规范(第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);
}
我并不反对 0xA3 的回答,但如果你使用:
BitConverter.GetBytes(true);
BitConverter.GetBytes(false);
你会得到一个{ 1 }
and的字节数组{ 0 }
。换句话说,二进制值将是00000001
和00000000
。
这并不意味着 .NET 就是这样处理内存中的布尔值的——它只是将它们转换为字节数组的方式。
通常Boolean
,值由false
全为零和true
其他任何值表示。为简单起见,由于二进制补码,这通常为 -1(有符号整数类型的所有位)。
几乎所有语言/环境(不仅是 .NET)都实现true
为等效于整数值 1,并且false
等于 0。1 )
但是,有一个重要的例外,即 VB6,它true
等于 –1。这给迁移到 .NET 带来了很多困难,因为 VB6 的松散类型系统允许在同一个表达式中混合整数和布尔值,并且2 And True
在 VB6 中的含义与在 VB.NET 中不同。
1)尽管许多系统允许将任何不等于 0 的数值隐式转换为true
布尔上下文。一些(尤其是动态的)语言甚至更进一步,说除了特殊对象(例如None
,空数组,列表继续......)之外的所有对象都是相等的true
。