【问题标题】:Why does PRINT'ing a true boolean expression output -1?为什么打印一个真正的布尔表达式输出-1?
【发布时间】:2014-04-12 14:37:41
【问题描述】:

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

READY.
A=(5=5)

READY.
PRINT A
-1

为什么是 -1 而不是 1?

【问题讨论】:

  • true 不为零,所以这并不重要。从技术上讲,一个有符号的二进制补码二进制数可以是 0 或 -1,也许正是因为如此。
  • 计算 5=5 时返回 True,因为比较相等。

标签: basic c64


【解决方案1】:

简答

为什么是 -1 而不是 1?

这只是一个约定


一些猜测...

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

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

0 => 00000000 00000000

同意另一个约定,其中true 全部设置为:

11111111 11111111

(一个非常合理的选择,因为所有1 是所有0 的按位NOT

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


底注:

如果您想查看 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)

【讨论】:

  • 在 Commodore BASIC 中,变量和数字文字默认为 5 字节浮点数,而不是 2 字节整数。但在算术评估期间,即使是真正的整数也会被提升为浮点数。因此,您的解释与问题中提供的示例没有太大关系。
  • @Psychonaut 我做了一些研究,你是对的。我更新了答案。谢谢。
【解决方案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$

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

    • 你能用一些例子澄清“大多数语言”部分吗?我知道的大多数语言都使用 1,而不是 -1(少数使用 0,但它们很疯狂):)
    • @roe:你说得对,比我记忆中更多的语言使用 1 而不是 -1。我相应地调整了答案。
    • Commodore Basic DOES 使用 16 位整数来存储变量值,除非需要浮点数,因为要存储的值超出 16 位整数的限制或有小数
    • @Paolo 只有以% 标记为整数变量的变量才会存储为 16 位值。并且无论类型如何,计算都是以浮点精度完成的。无论数值类型如何,标量变量甚至占用相同的内存空间,每个整数标量变量“浪费”树字节。
    • @BlackJack 你是对的。我更新了答案。谢谢。
    猜你喜欢
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    相关资源
    最近更新 更多