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类型表示布尔逻辑量.类型的可能值bool是true和false.
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#代码仍将具有相同的语义.
以下是一个演示的底层表示的代码快速位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)
我并不反对0xA3的答案,但如果你使用:
BitConverter.GetBytes(true);
BitConverter.GetBytes(false);
Run Code Online (Sandbox Code Playgroud)
你会得到一个{ 1 }和的字节数组{ 0 }.换句话说,二进制值将是00000001和00000000.
这并不意味着.NET如何处理内存中的布尔值 - 它只是将它们转换为字节数组的方式.
几乎所有语言/环境(不仅是 .NET)都实现true为相当于整数值 1,并且false等于 0。)
然而,\xe2\x80\x99 有一个重要的例外,即 VB6,它等于true\xe2\x80\x931。这使得迁移到 .NET 变得相当困难,因为 VB6 的松散类型系统允许在同一表达式中混合整数和布尔值,并且在2 And TrueVB6 中意味着与 VB.NET 中不同的东西。
1)尽管许多系统允许将任何不等于 0 的数值隐式转换为true布尔上下文。一些(特别是动态)语言甚至更进一步,说除了特殊对象(例如None,空数组,列表在\xe2\x80\xa6)之外的所有对象都相等true。