В Commodore 64 BASIC V2, PRINT'ing вывод истинных булевых выражений -1:
READY.
A=(5=5)
READY.
PRINT A
-1
Почему -1, а не 1?
В Commodore 64 BASIC V2, PRINT'ing вывод истинных булевых выражений -1:
READY.
A=(5=5)
READY.
PRINT A
-1
Почему -1, а не 1?
Commodore Basic не имеет логического типа данных. Булевское выражение оценивается числом, где 0 означает False и -1 означает true.
Поскольку не существует логических типов данных, не существует выражений булевого типа. Вы можете использовать любое числовое выражение в выражении IF
, и оно будет интерпретировать любое ненулевое значение как True.
Некоторые языки, где логическое значение является числовым или где оно может быть преобразовано в числовое значение, использует -1 для представления истинного значения. Для целочисленного значения 0 все биты очищаются, а для -1 устанавливаются все биты, поэтому их можно рассматривать как естественные дополнения друг к другу.
Eventhough Commodore Basic не использует целые числа, кроме чисел с плавающей запятой, значение -1 предположительно было выбрано, потому что некоторые другие языки используют его.
Почему -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
(это происходит на большинстве языков, возможно, все).
Существует способ, которым это можно использовать, настраивая цикл 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$