Что такое двоичное представление логического значения в c # - PullRequest
13 голосов
/ 26 июля 2010

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

Ответы [ 5 ]

20 голосов
/ 26 июля 2010

bool - это встроенный базовый тип в C #. Любое базовое представление будет деталью реализации.

В спецификации языка C # 4.0 указано в разделе 4.1.8:

Тип bool представляет логические величины. Возможные значения типа bool: true и false.

.

Стандартных преобразований между bool и другими типами не существует. В частности, тип bool отличается от целочисленных типов и отличается от них, и значение bool нельзя использовать вместо целочисленного значения, и наоборот.

В языках C и C ++ нулевое целое число или значение с плавающей запятой или нулевой указатель могут быть преобразованы в логическое значение false и ненулевое целое число или значение с плавающей запятой, или ненулевое значение нулевой указатель может быть преобразован в логическое значение true. В C # такие преобразования выполняются путем явного сравнения интегрального значения или значения с плавающей запятой с нулем или путем явного сравнения ссылки на объект с нулем.

Если мы возьмем этот уровень еще глубже и увидим, как соответствующий тип указан в Common Intermediate языке (CIL), мы увидим, что логический тип CLI занимает 1 байт в памяти. Спецификация Common Language Infrastructure (CLI) говорится в Разделе III, раздел 1.1.2:

Логический тип CLI занимает 1 байт в памяти. Битовая комбинация всех нулей обозначает значение false. Немного шаблон с любым одним или несколькими установленными битами (аналогично ненулевому целому числу) обозначает значение true.

Однако это указано на другом уровне, и из C # вам не нужно об этом заботиться; даже если будущая версия спецификации CLI может изменить представление логического типа, или если компилятор C # решил сопоставить bool в C # с чем-то другим, ваш код C # будет по-прежнему иметь ту же семантику.

7 голосов
/ 26 июля 2010

Вот небольшой фрагмент кода, который демонстрирует базовое представление 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, это всего лишь деталь реализации. Вы не должны полагаться на эту деталь или предполагать, что она останется согласованной в разных версиях и / или реализациях, или даже в том, что текущая платформа всегда использует одно и то же согласованное представление.)

EDIT ...

Спецификация 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);
}
5 голосов
/ 26 июля 2010

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

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

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

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

0 голосов
/ 26 июля 2010

Как правило, Boolean значения представлены как false - все нули, а true - что-либо еще. Для простоты обычно это -1 (все биты целочисленного типа со знаком) из-за дополнения до двух .

0 голосов
/ 26 июля 2010

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

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


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

...