Логическое значение true – положительное 1 или отрицательное 1?

StackOverflow https://stackoverflow.com/questions/727196

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

-Адам

Другие советы

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

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

Почему вы решили, что ненулевые значения верны?В Аде true — это TRUE, а false — FALSE.Неявного преобразования типов в BOOLEAN и обратно не существует.

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

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

но

  0x00000001 & 0x00000010 == 0x00000000 (false)
  0x00000001 && 0x00000010 == 0xffffffff (true)

ИМХО, если хочешь придерживаться ЛОЖЬ=0x00, вам следует использовать 0x01.0xFF обычно:

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

или

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

И в обоих случаях это, вероятно, означает ЛОЖЬ.Следовательно, соглашение о возвращаемом значении *nix из исполняемых файлов, которое истинный=0x00, и любое ненулевое значение является ложным.

-1 длиннее, чем 1...

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

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

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

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

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

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

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

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

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

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

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

Спроектируйте язык так, чтобы 0 было ложью, а ненулевое значение — истиной.Нет необходимости что-либо «конвертировать», а мысль о «ненулевом» вместо какого-то конкретного значения поможет вам правильно написать код.

Если у вас есть встроенные символы, такие как «Истина», тогда выбирайте значение, но всегда думайте, что «ненулевое значение истинно», а не «0x01 истинно».

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top