在 Commodore 64 BASIC V2 中,打印一个真正的布尔表达式输出 -1:
READY.
A=(5=5)
READY.
PRINT A
-1
为什么是 -1 而不是 1?
Commodore Basic 没有布尔数据类型。布尔表达式的计算结果为一个数字,其中 0 表示 False,-1 表示 true。
由于没有布尔数据类型,因此没有布尔类型表达式。您可以在语句中使用任何数值表达式IF
,它会将任何非零值解释为 True。
一些布尔值是数字或可以转换为数值的语言使用 -1 来表示真值。对于整数值 0,所有位都被清除,而对于 -1,所有位都被设置,因此它们可以被视为彼此的自然互补。
尽管 Commodore Basic 不使用整数而是浮点数,但应该选择值 -1 是因为其他一些语言使用它。
为什么是 -1 而不是 1?
这只是一个约定
选择此约定的原因可能与大多数平台上整数的内部表示有关:
假设一个布尔值存储在一个 16 位宽的整数中;false
是0
(每一位都未设置)。
0 => 00000000 00000000
同意另一个true
设置所有位的约定是有意义的:
11111111 11111111
(一个非常合理的选择,因为 all是all1
的 bitwise )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
代码中语句的行为。
任何不同于 from的值都会在语句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 for 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$