13

在 Commodore 64 BASIC V2 中,打印一个真正的布尔表达式输出 -1:

READY.
A=(5=5)

READY.
PRINT A
-1

为什么是 -1 而不是 1?

在此处输入图像描述

4

3 回答 3

9

Commodore Basic 没有布尔数据类型。布尔表达式的计算结果为一个数字,其中 0 表示 False,-1 表示 true。

由于没有布尔数据类型,因此没有布尔类型表达式。您可以在语句中使用任何数值表达式IF,它会将任何非零值解释为 True。

一些布尔值是数字或可以转换为数值的语言使用 -1 来表示真值。对于整数值 0,所有位都被清除,而对于 -1,所有位都被设置,因此它们可以被视为彼此的自然互补。

尽管 Commodore Basic 不使用整数而是浮点数,但应该选择值 -1 是因为其他一些语言使用它。

于 2014-03-09T15:33:22.283 回答
6

简短的回答

为什么是 -1 而不是 1?

这只是一个约定


一些猜测...

选择此约定的原因可能与大多数平台上整数的内部表示有关:

假设一个布尔值存储在一个 16 位宽的整数中;false0(每一位都未设置)。

0 => 00000000 00000000

同意另一个true设置所有位的约定是有意义的:

11111111 11111111

(一个非常合理的选择,因为 all是all1的 bitwise )NOT0

位全部设置的有符号整数的十进制表示为-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中进行评估(这发生在大多数语言上,也许是所有语言)。trueIF


底注:

如果您想查看 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)
于 2014-05-10T22:53:42.473 回答
2

有一种方法可以通过自定义 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$
于 2014-05-06T10:54:07.470 回答