Почему PRINT'ing вывод истинного булева выражения -1?

В Commodore 64 BASIC V2, PRINT'ing вывод истинных булевых выражений -1:

READY.
A=(5=5)

READY.
PRINT A
-1

Почему -1, а не 1?

enter image description here

Ответ 1

Commodore Basic не имеет логического типа данных. Булевское выражение оценивается числом, где 0 означает False и -1 означает true.

Поскольку не существует логических типов данных, не существует выражений булевого типа. Вы можете использовать любое числовое выражение в выражении IF, и оно будет интерпретировать любое ненулевое значение как True.

Некоторые языки, где логическое значение является числовым или где оно может быть преобразовано в числовое значение, использует -1 для представления истинного значения. Для целочисленного значения 0 все биты очищаются, а для -1 устанавливаются все биты, поэтому их можно рассматривать как естественные дополнения друг к другу.

Eventhough Commodore Basic не использует целые числа, кроме чисел с плавающей запятой, значение -1 предположительно было выбрано, потому что некоторые другие языки используют его.

Ответ 2

Почему -1, а не 1?

Целые числа C64 подписаны и имеют ширину 16 бит (поэтому я буду использовать 16 бит в следующих примерах)

Как false, 0, каждый бит отключен

0 => 00000000 00000000

true (не false) по каждому битовому набору

11111111 11111111

Десятичное представление знакового целого, чьи биты установлены, -1

-1 => 11111111 11111111

В то время как двоичное представление 1 является

1 => 00000001 00000000

(бит установлен на первый байт, так как процессор 6502 C64 имеет большой конец)

Итак, почему -1, а не 1: это просто соглашение; но если вы посмотрите на двоичное представление значения, вы можете согласиться с тем, что соглашение имеет смысл.


Что касается кода на скриншоте, значение true - -1

true => 11111111 11111111 => -1

НО любое значение, отличное от 0, оценивается как true в выражении IF (это происходит на большинстве языков, возможно, все).

Ответ 3

Существует способ, которым это можно использовать, настраивая цикл for, т.е. если вы хотите, чтобы что-то произошло до нажатия клавиши, можно было бы:

0 for i=-1 to 0
1 rem logic here ...
10 get a$: i=(a$=""): next i

Это такая же логика, как и цикл do... while.

Изменить. Если вы специально хотели, чтобы 0 было ложным, а 1 - true, вы могли бы определить функцию следующим образом (я забыл о ключе АБС, поскольку я не использовал его, возможно, через 20 лет: - |):

0 def fn b(x) = abs(x)
1 i = 7
2 a$ = "hello"
3 if fn b (i=6) then print "i is 6"
4 if fn b (i<10) then print "i is less than 10"
5 if fn b (a$="hi") then print "hey there!"
6 if fn b (a$="hello") then print a$