Подтвердить что ты не робот

Что такое двоичное представление булевского значения в С#

Я знаю, что логическое значение равно 1 байту (8 бит) Но я хотел бы знать, каково его двоичное представление. например decimal = > двоичный 4 = > 100 (0000 0100) 8 = > 1000 (0000 1000) Значение bool = >

4b9b3361

Ответ 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.