1

为了娱乐,我做了

1 1 RSHIFT . 0  ok

我可以在这里看到本机类型与有意义的类型是互补的,因为 (true is -1)。然而这让我大吃一惊。

1 -1 LSHIFT . -9223372036854775808  ok

这里发生了什么?

4

2 回答 2

2

首先, 的参数LSHIFT被解释为无符号(因此,要移位的位数始终为非负数)。其次,上述惊喜的原因是条件不明确

关于LSHIFT词的标准摘录:

如果u大于或等于信元中的位数,则存在不明确的情况。

因此,这种情况下的结果取决于特定的 Forth 系统实现。你不应该依赖它。

请注意,u堆栈符号中表示无符号,请参见表 3.1:数据类型

顺便说一句,在此类实验中使用二进制数转换基数并将数字打印为无符号通过U.R

#2 BASE !
1  #63 LSHIFT #65 U.R
1 -#64 LSHIFT #65 U.R
1 -#65 LSHIFT #65 U.R
1 -#1  LSHIFT #65 U.R
于 2018-02-22T09:47:31.690 回答
0

它似乎

  • LSHIFT在 64 位 2 的补码表示上以负方向环绕位,这就是您所看到的

    1 -1  LSHIFT . -9223372036854775808  ok
    1 -65 LSHIFT . -9223372036854775808  ok
    1 -64 LSHIFT . 1  ok
    
  • LSHIFT在正方向环绕位

    1 64 LSHIFT . 1  ok
    
  • RSHIFT向正方向丢弃位而不是环绕

    1 1 RSHIFT . 0  ok
    
  • RSHIFT将位丢弃在负方向而不是环绕

    1 -30 RSHIFT . 0  ok
    
于 2018-02-20T00:00:05.920 回答