为了娱乐,我做了
1 1 RSHIFT . 0 ok
我可以在这里看到本机类型与有意义的类型是互补的,因为 (true is -1
)。然而这让我大吃一惊。
1 -1 LSHIFT . -9223372036854775808 ok
这里发生了什么?
首先, 的参数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
它似乎
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