bit-shift - 第四为什么负 LSHIFT 会这样表现?

标签 bit-shift forth gforth

为了娱乐,我这么做了

1 1 RSHIFT . 0  ok

我可以在这里看到 native 类型与有意义的类型是成对的,因为(true 是 -1)。然而这让我感到惊讶。

1 -1 LSHIFT . -9223372036854775808  ok

这是怎么回事?

最佳答案

首先,lshift 的参数被解释为无符号(因此,要移位的位数始终为非负)。在第二次, 上述意外的原因是一个不明确的条件

摘自 6.1.1805 lshift 部分2012 年第四版标准:

An ambiguous condition exists if u is greater than or equal to the number of bits in a cell.

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

请注意 stack notation 中的 u表示无符号数字(单格),请参阅 table 3.1: Data types .

顺便说一句,在此类实验中使用二进制数字转换基数并通过 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

关于bit-shift - 第四为什么负 LSHIFT 会这样表现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48875974/

相关文章:

stack - 如何在 Forth(或 Factor)中编写应用程序?

forth - 如何列出 Forth 中当前的单词集

forth - 如何检查 Forth 中的单词是否传递了足够的参数?

string - Gforth - 如何获取字符串的代码点?

c - 使用移位运算符拆分大十进制数

c - C 中的移位运算符前置一个而不是零

c - KnR 练习 2-8 : Rotate a number to the right. 可以吗?

python - 如何在 Python 中将二进制向量旋转到最小值

arrays - 在 Forth 中设置数组元素的问题

forth - 如何控制新的 Forth 单词的编译位置?