Я знаю, что логическое значение равно 1 байту (8 бит) Но я хотел бы знать, каково его двоичное представление. например decimal = > двоичный 4 = > 100 (0000 0100) 8 = > 1000 (0000 1000) Значение bool = >
Что такое двоичное представление булевского значения в С#
Ответ 1
bool
- это встроенный базовый тип в С#. Любое базовое представление будет деталью реализации.
Спецификация языка С# 4.0 в разделе 4.1.8:
Тип
bool
представляет логические логические величины. Возможные значения типаbool
:true
иfalse
.Никаких стандартных преобразований не существует между
bool
и другими типами. В частности, типbool
различен и отделен от интегральных типов, а значениеbool
не может использоваться вместо целочисленного значения и наоборот.На языках C и С++ нулевое целочисленное значение или значение с плавающей запятой или нулевой указатель могут быть преобразованы в логическое значение
false
и ненулевое значение интеграла или с плавающей запятой, нулевой указатель может быть преобразован в логическое значениеtrue
. В С# такие преобразования выполняются путем явного сравнения значения целого или с плавающей запятой до нуля или путем прямого сравнения ссылки объекта на null.
Если мы сделаем это на один уровень глубже и посмотрим, как соответствующий тип будет указан на языке Common Intermediate (CIL), мы увидим, что булевский тип CLI занимает 1 байт в памяти. Спецификация общей языковой инфраструктуры (CLI) говорится в разделе 1.1.2 раздела III:
Булевой тип CLI занимает 1 байт в памяти. Битовая диаграмма всех нулей обозначает значение false. Немного шаблон с любым одним или несколькими установленными битами (аналогично ненулевому целому числу) обозначает значение true.
Однако это указано на другом уровне и изнутри С# вам не нужно заботиться; даже если будущая версия спецификации CLI может изменить представление булевского типа или если компилятор С# решил сопоставить bool
в С# с чем-то другим, ваш код С# все равно будет иметь одинаковую семантику.
Ответ 2
Вот небольшой фрагмент кода, который демонстрирует базовое представление 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 байт в Память. Битовая диаграмма всех нулей обозначает значение false. Немного шаблон с любым одним или несколькими установленными битами (аналогично ненулевому целому числу) обозначает значение true.
Похоже, что текущая 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);
}
Ответ 3
Я не противоречу ответам 0xA3, но если вы используете:
BitConverter.GetBytes(true);
BitConverter.GetBytes(false);
Вы получите массив байтов { 1 }
и { 0 }
. Другими словами, двоичные значения будут 00000001
и 00000000
.
Это не означает, что .NET обрабатывает логические значения в памяти - это просто то, как он преобразует их в массивы байтов.
Ответ 4
Почти все языки/среды (не только .NET) реализуют true
как эквивалент интегральному значению 1, а false
равный 0. 1)
Однако важно одно исключение, а именно VB6, которое имеет true
, равное -1. Это затрудняло переход к .NET, потому что свободная система типов VB6 позволяла смешивать целые числа и логические выражения в одном выражении, а 2 And True
означала что-то другое в VB6, чем в VB.NET.
1) Хотя многие системы допускают неявное преобразование любого числового значения не равным 0 в true
в булевом контексте. Некоторые (особенно динамические) языки даже идут дальше и говорят, что все объекты, за исключением специальных объектов (например, None
, пустой массив, список продолжается...) равны true
.
Ответ 5
Обычно значения Boolean
представлены как false
как все нули, а true
- что-то еще. Для простоты это обычно -1 (все биты встроенного интегрального типа) из-за Two Complement.