Булево значение true - положительный 1 или отрицательный 1? - PullRequest
12 голосов
/ 07 апреля 2009

Я разрабатываю язык и пытаюсь решить, будет ли true 0x01 или 0xFF. Очевидно, что все ненулевые значения будут преобразованы в true, но я пытаюсь определить точное внутреннее представление.

Каковы плюсы и минусы для каждого выбора?

Ответы [ 11 ]

29 голосов
/ 07 апреля 2009

Это не имеет значения, если оно удовлетворяет правилам внешнего представления.

Я бы взял подсказку из C здесь, где false определено абсолютно как 0, а true определено как не false. Это важное различие по сравнению с абсолютным значением для истины. Если у вас нет типа, который имеет только два состояния, вы должны учитывать все значения в этом типе значений, что является истинным, а что ложным.

22 голосов
/ 08 апреля 2009

0 - ложь, потому что процессор имеет флаг, который устанавливается, когда регистр установлен на ноль.

Никакие другие флаги не установлены для любого другого значения (0x01, 0xff и т. Д.) - но нулевой флаг устанавливается в значение false, когда в регистре есть ненулевое значение.

Таким образом, ответы здесь, призывающие определять 0 как ложное, а все остальное как истинное, верны.

Если вы хотите «определить» значение по умолчанию для true, то 0x01 лучше, чем большинство:

  • Он представляет собой одно и то же число в каждой длине бита и со знаком
  • Требуется тестирование только одного бита, если вы хотите узнать, является ли он истинным, должен ли нулевой флаг быть недоступным или дорогостоящим для использования
  • Не нужно беспокоиться о расширении знака при преобразовании в другие типы
  • Логические и арифметические выражения действуют на него одинаково

-Adam

11 голосов
/ 07 апреля 2009

Использование -1 имеет одно преимущество в слабо типизированном языке - если вы запутались и используете битовый оператор and вместо логического оператора and, ваше условие все равно будет оцениваться правильно, пока один из операндов был преобразован в каноническое логическое представление. Это неверно, если каноническое представление равно 1.

  0xffffffff & 0x00000010 == 0x00000010 (true)
  0xffffffff && 0x00000010 == 0xffffffff (true)

но

  0x00000001 & 0x00000010 == 0x00000000 (false)
  0x00000001 && 0x00000010 == 0xffffffff (true)
11 голосов
/ 07 апреля 2009

Почему вы выбираете, что ненулевые значения являются истинными? В Аде истина - ИСТИНА, а ложь - ЛОЖЬ. Не существует неявного преобразования типов в и из BOOLEAN.

5 голосов
/ 07 апреля 2009

IMO, если вы хотите придерживаться false = 0x00, вы должны использовать 0x01. 0xFF обычно:

  • признак того, что какая-то операция переполнилась

или

  • маркер ошибки

И в обоих случаях это, вероятно, означает false . Следовательно, * nix возвращает соглашение об исполняемых значениях, что true = 0x00, а любое ненулевое значение равно false.

4 голосов
/ 07 апреля 2009

-1 больше, чем 1 ...

В конце концов, это не имеет значения, поскольку 0 ложно, а все остальное верно, и вы никогда не сравнитесь с точным представлением истины.

Редактировать, для тех, кто голосует вниз, объясните, пожалуйста, почему. Этот ответ по сути такой же, как и тот, который в настоящее время оценивается в +19. Таким образом, разница в 21 голос за один и тот же базовый ответ.

Если это из-за комментария -1, это правда, тот, кто на самом деле определяет "true" (например, автор компилятора), должен будет использовать -1 вместо 1, предполагая, что он решил использовать точное представление. -1 будет длиться дольше, чем 1, и конечный результат будет таким же. Это глупое утверждение, оно должно было быть глупым, потому что между ними нет никакой разницы (1 или -1).

Если вы собираетесь что-то отметить, по крайней мере, предоставьте обоснование для этого.

3 голосов
/ 08 апреля 2009

Плюсов нет, и минусов тоже нет. Пока вы предоставляете автоматическое преобразование из целого числа в логическое, оно будет произвольным, поэтому не имеет значения, какое число вы выберете.

С другой стороны, если вы не разрешите это автоматическое преобразование, у вас будет профессионал: у вас не будет какого-то совершенно произвольного правила на вашем языке. Вы бы не получили (7 - 4 - 3) == false, или 3 * 4 + 17 == "Hello", или "Hi mom!" == Complex(7, -2).

3 голосов
/ 07 апреля 2009

0xff - нечетный выбор, поскольку он подразумевает, что 8 бит - это минимальная единица хранения. Но нередко хотеть хранить логические значения более компактно.

Возможно, вы хотите перефразировать, подумав о том, что логические операторы выдают что-то, что составляет всего один 0 или 1 бит (который работает независимо от расширения знака), или все нули или все единицы (и зависит от расширения знака подписанного количество двух дополнений для поддержания единичных значений любой длины).

Я думаю, что ваша жизнь проще с 0 и 1.

2 голосов
/ 07 апреля 2009

Я думаю, что метод C - это путь. 0 означает ложь, все остальное означает истину. Если вы выберете другое сопоставление для true, то у вас останется проблема с неопределенными значениями, которые не являются ни истиной, ни ложью.

Если это язык, который вы будете компилировать для определенного набора инструкций, который имеет специальную поддержку для конкретного представления, то я позволю вам этим руководствоваться. Но без какой-либо дополнительной информации, для «стандартного» внутреннего представления, я бы пошел с -1 (все 1 в двоичном виде). Это значение хорошо расширяется до любого логического размера, который вы хотите (однобитный, 8-битный, 16 и т. Д.), И если вы разбиваете «ИСТИНА» или «ЛОЖЬ» на меньшие «ИСТИНА» или «ЛОЖЬ», это все равно тот же самый. (где, если вы сломали 16-битное ИСТИНА = 0x0001, вы получите ЛОЖЬ = 0x00 и ИСТИНА = 0x01).

1 голос
/ 08 апреля 2009

Что бы вы ни делали, после выбора значений не изменяйте их. В FORTH-77 true и false были определены как 1 и 0. Затем FORTH-83 переопределил их как -1 и 0. Было немало (ну хорошо, только несколько, это FORTH, о котором мы говорим) вызвано этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...