В Commodore 64 BASIC V2, PRINT'ing истинное логическое выражение результатов -1:Почему PRINT'ing вывод истинного булева выражения -1?
READY.
A=(5=5)
READY.
PRINT A
-1
Почему -1, а не 1?
В Commodore 64 BASIC V2, PRINT'ing истинное логическое выражение результатов -1:Почему PRINT'ing вывод истинного булева выражения -1?
READY.
A=(5=5)
READY.
PRINT A
-1
Почему -1, а не 1?
Commodore Basic не имеет логического типа данных. Булевское выражение оценивается числом, где 0 означает False, а -1 означает true.
Поскольку не существует логических типов данных, не существует выражений типа boolean. Вы можете использовать любое числовое выражение в операторе IF
, и оно будет интерпретировать любое ненулевое значение как значение True.
Некоторые языки, где логическое значение является числовым или где оно может быть преобразовано в числовое значение, использует -1 для представления истинного значения. Для целочисленного значения 0 все биты очищаются, а для -1 устанавливаются все биты, поэтому их можно рассматривать как естественные дополнения друг к другу.
Eventhough Commodore Basic не использует целые числа, а числа с плавающей запятой, предположительно, было выбрано значение -1, потому что некоторые другие языки используют его.
Делает смысл. благодаря! – Max
Не могли бы вы пояснить часть «большинства языков» с некоторыми примерами? Большинство языков, которые я знаю, используют 1, а не -1 (а некоторые используют ноль, но они сумасшедшие) :) – falstro
@roe: Вы правы, больше языков, чем я помню, использует 1, а не -1. Я соответствующим образом скорректировал ответ. – Guffa
Существует способ, что это может быть использовано, настраивая для цикла, то есть, если вы хотите что-то не произойдет, пока нажата клавиша, один может:
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$
Почему -1 и не 1?
C64 целые подписываются и 16 бит (так что я буду использовать 16 бит в следующих примерах)
Как фальшь 0, каждый бит незадана
0 => 00000000 00000000
истинно (не ошибочно) по соглашению каждый бит набор
11111111 11111111
десятичное представление целого числа, чьи биты все множество -1
-1 => 11111111 11111111
В то время как двоичное представление 1 является
1 => 00000001 00000000
(Бит set находится на первом байте, так как процессор 6502 C64 имеет большой размер)
Вот почему -1
и не 1
: это просто конвенция; но если вы посмотрите на двоичное представление значения, вы можете согласиться с тем, что соглашение имеет смысл.
Что касается кода на скриншоте значение истинного является -1
true => 11111111 11111111 => -1
НО любое значение, отличное от 0
оценивается как true
в IF
заявлении (это происходит на большинстве языки, возможно, все).
В Commodore BASIC переменные и числовые литералы по умолчанию имеют 5-байтовое число с плавающей запятой, а не 2-байтовые целые числа. Но даже целые числа bona-fide продвигаются к плавающей точке во время арифметической оценки. Поэтому ваше объяснение не имеет большого значения для примера, представленного в вопросе. – Psychonaut
true отличное от нуля, поэтому это не имеет большого значения. Технически, двоичное число с двойным дополнением с одним битом может быть 0 или -1, возможно, из-за этого. – falstro
При вычислении 5 = 5 он возвращает значение True, потому что сравнение равно. – eoredson