Я знаю, что булево значение составляет 1 байт (8 битов длиной), Но я хотел бы знать, то, что является его двоичным представлением. например, десятичное число => двоичные 4 => 100 (0000 0100) 8 => 1000 (0000 1000) bool оценивает =>???
Вот небольшой фрагмент кода, демонстрирующий базовое представление 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
, по-видимому, представляет истинное
, а 0
, похоже, представляет ложное
], это всего лишь деталь реализации. Вы не должны ' Я полагаюсь на эту деталь или предполагаю, что она останется согласованной для разных версий и / или реализаций, или даже что текущая платформа всегда использует одно и то же согласованное представление.)
РЕДАКТИРОВАТЬ ...
ECMA Спецификация CLI (раздел III, раздел 1.1.2) довольно четко описывает допустимые представления типа Boolean
:
1.1.2 Тип данных Boolean
Тип Boolean CLI занимает 1 байт в объем памяти. Битовая комбинация всех нулей обозначает значение false. Немного шаблон с одним или несколькими установленными битами (аналогично ненулевому целому числу) обозначает значение true.
Похоже, что текущая среда Microsoft CLR придерживается спецификации ECMA, разрешая несколько представлений true
. В следующем примере отображается одна строка «Ложь» (для 0
), за которой следуют 255 строк «Истина»:
// 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 }
. Другими словами, двоичные значения будут 00000001
и 00000000
.
Это не означает, что именно так .NET работает с булевыми значениями в памяти - это просто способ их преобразования в байтовые массивы.
Почти все языки / среды (не только .NET) реализуют true
как эквивалент целого значения 1 и false
равное 0. 1)
Однако есть одно важное исключение, а именно VB6, для которого true
было равно –1. Это затрудняло переход на .NET, потому что свободная система типов VB6 позволяла смешивать целые числа и логические значения в одном выражении, а 2 И True
означало в VB6 нечто иное, чем в VB. .СЕТЬ.
1) Хотя многие системы допускают неявное преобразование любого числового значения, не равного 0, в истину
в логическом контексте. Некоторые (особенно динамические) языки идут еще дальше и говорят, что все объекты, кроме специальных (например, Нет
, пустой массив, список продолжается…) равны true
.
Обычно булевы
значения представлены false
- это все нули, а true
- все остальное. Для простоты это обычно -1 (все биты знакового интегрального типа) из-за дополнения двойки.
bool
- это встроенный базовый тип в C #. Любое базовое представление будет деталью реализации.
Спецификация языка C # 4.0 гласит в разделе 4.1.8:
Тип
bool
представляет собой логические логические величины. Возможные значения типаbool
:true
иfalse
.Не существует стандартных преобразований между
bool
и другими типами. В частности, типbool
отличается и отличается от целочисленных типов, а значениеbool
не может использоваться вместо целого значения, и наоборот.В языках C и C ++ нулевое целое значение или значение с плавающей запятой или нулевой указатель могут быть преобразованы в логическое значение
false
и ненулевое целочисленное значение или значение с плавающей запятой, или ненулевой указатель может быть преобразован в логическое значениеtrue
. В C # такие преобразования выполняются путем явного сравнения целочисленного значения или значения с плавающей запятой с нулем или путем явного сравнения ссылки на объект с нулевым значением.
Если мы углубимся в этот уровень и посмотрим, как соответствующий тип указан в Common Intermediate Language (CIL), мы увидим, что логический тип CLI занимает 1 байт в памяти. Спецификация Common Language Infrastructure (CLI) говорит в Разделе III, раздел 1.1.2:
Логический тип CLI занимает 1 байт в памяти. Битовая комбинация всех нулей означает ложное значение.Немного шаблон с одним или несколькими установленными битами (аналогично ненулевому целому числу) обозначает значение true.
Однако это указано на другом уровне, и изнутри C # вам не о чем беспокоиться; даже если будущая версия спецификации CLI может изменить представление логического типа или если компилятор C # решил сопоставить bool
в C # на что-то другое, ваш код C # все равно будет иметь ту же семантику.