Каково двоичное представление булева значения в c#

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

13
задан emm 26 July 2010 в 14:36
поделиться

5 ответов

Вот небольшой фрагмент кода, демонстрирующий базовое представление 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);
}
7
ответ дан 1 December 2019 в 19:58
поделиться

Я не противоречу ответу 0xA3, но если вы используете:

BitConverter.GetBytes(true);
BitConverter.GetBytes(false);

Вы получите байтовый массив из { 1 } и { 0 }. Другими словами, двоичные значения будут 00000001 и 00000000.

Это не означает, что именно так .NET работает с булевыми значениями в памяти - это просто способ их преобразования в байтовые массивы.

5
ответ дан 1 December 2019 в 19:58
поделиться

Почти все языки / среды (не только .NET) реализуют true как эквивалент целого значения 1 и false равное 0. 1)

Однако есть одно важное исключение, а именно VB6, для которого true было равно –1. Это затрудняло переход на .NET, потому что свободная система типов VB6 позволяла смешивать целые числа и логические значения в одном выражении, а 2 И True означало в VB6 нечто иное, чем в VB. .СЕТЬ.


1) Хотя многие системы допускают неявное преобразование любого числового значения, не равного 0, в истину в логическом контексте. Некоторые (особенно динамические) языки идут еще дальше и говорят, что все объекты, кроме специальных (например, Нет , пустой массив, список продолжается…) равны true .

0
ответ дан 1 December 2019 в 19:58
поделиться

Обычно булевы значения представлены false - это все нули, а true - все остальное. Для простоты это обычно -1 (все биты знакового интегрального типа) из-за дополнения двойки.

0
ответ дан 1 December 2019 в 19:58
поделиться

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 # все равно будет иметь ту же семантику.

20
ответ дан 1 December 2019 в 19:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: