Почему PRINT'ing возвращает истинное логическое выражение -1?

В Commodore 64 BASIC V2, PRINT'ing истинное логическое выражение выдает -1:

READY.
A=(5=5)

READY.
PRINT A
-1

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

3 ответа

Решение

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

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

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

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

Короткий ответ

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

Это просто соглашение


Некоторые предположения...

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

Предположим, что логическое значение хранится в целочисленном формате 16 бит; false является 0 (каждый бит не установлен).

0 => 00000000 00000000

Имеет смысл договориться о другой конвенции, где true все биты установлены:

11111111 11111111

(очень разумный выбор, так как все 1 побитовый NOT из всех 0)

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

-1 => 11111111 11111111

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

1 => 00000001 00000000 (на платформе с прямым порядком байтов).

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

Однако эта конвенция далеко не повсеместно принята, несмотря на все вышеизложенные соображения. На многих языках true приведен к числовому значению 1,


Важное примечание о коде вы разместили:

Вы написали

A=(5=5)

A реальная переменная, значение которой представлено 5 байтами (1 для показателя степени, 4 для мантиссы).

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

(все биты 1 приведет к значению -1.70141183e+38)

Итак, снова C64 Basic просто придерживается соглашения.


Наконец, давайте объясним поведение IF заявления в вашем коде.

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


Нижняя нота:

Если вы хотите взглянуть на внутреннее представление переменной C64 (только целочисленные или вещественные, а не строки), вы можете использовать следующий код:

READY.

10 REM THE VARIABLE TO INSPECT
20 A=(5=5)
30 REM THE ADDR. OF THE FIRST VARIABLE
40 B=PEEK(45)+256*PEEK(46)
50 REM DISPLAY THE VAR'S 7 BYTES
60 FOR C=B TO B+6
70 PRINT C;": ";PEEK(C)
80 NEXT C

RUN
 2227 :  65
 2228 :  0
 2229 :  129
 2230 :  128
 2231 :  0
 2232 :  0
 2233 :  0

Обратите внимание, что первые два адреса (2227, 2228) хранят имя переменной (65, 0 для A)

Вы можете попробовать объявить переменную как целое число и увидеть результат с

20 A%=(5=5)

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

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

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

Редактировать - если вы специально хотели, чтобы 0 было ложным, а 1 - истинным, вы могли бы определить функцию следующим образом (я забыл о ключевом слове ABS, поскольку я не использовал его, вероятно, в течение 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$
Другие вопросы по тегам