2014-03-09 3 views
11

В Commodore 64 BASIC V2, PRINT'ing истинное логическое выражение результатов -1:Почему PRINT'ing вывод истинного булева выражения -1?

READY. 
A=(5=5) 

READY. 
PRINT A 
-1 

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

enter image description here

+1

true отличное от нуля, поэтому это не имеет большого значения. Технически, двоичное число с двойным дополнением с одним битом может быть 0 или -1, возможно, из-за этого. – falstro

+0

При вычислении 5 = 5 он возвращает значение True, потому что сравнение равно. – eoredson

ответ

6

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

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

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

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

+0

Делает смысл. благодаря! – Max

+0

Не могли бы вы пояснить часть «большинства языков» с некоторыми примерами? Большинство языков, которые я знаю, используют 1, а не -1 (а некоторые используют ноль, но они сумасшедшие) :) – falstro

+0

@roe: Вы правы, больше языков, чем я помню, использует 1, а не -1. Я соответствующим образом скорректировал ответ. – Guffa

1

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

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$ 
5

Почему -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 заявлении (это происходит на большинстве языки, возможно, все).

+0

В Commodore BASIC переменные и числовые литералы по умолчанию имеют 5-байтовое число с плавающей запятой, а не 2-байтовые целые числа. Но даже целые числа bona-fide продвигаются к плавающей точке во время арифметической оценки. Поэтому ваше объяснение не имеет большого значения для примера, представленного в вопросе. – Psychonaut