为什么PRINT'ing一个真正的布尔表达式输出-1?

时间:2014-03-09 15:29:23

标签: basic c64

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

READY.
A=(5=5)

READY.
PRINT A
-1

为什么-1而不是1?

enter image description here

3 个答案:

答案 0 :(得分:7)

Commodore Basic没有布尔数据类型。布尔表达式求值为数字,其中0表示False,-1表示true。

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

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

尽管Commodore Basic没有使用整数但是使用浮点数,但是假设选择了值-1,因为其他一些语言使用它。

答案 1 :(得分:6)

简短回答

  

为什么-1而不是1?

这只是惯例


一些猜测......

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

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

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表示尾数)。

实数值0的内部C64表示是所有位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)

答案 2 :(得分:1)

有一种方法可以通过自定义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$