1

我发现和h之间的 NULL值不同:k.hq

q)0x00 vs 0W
0x7fffffffffffffff
q)0x00 vs 0N
0x8000000000000000
q)0x00 vs 0Ni
0x80000000
q)0x00 vs 0Wi
0x7fffffff
q)0x00 vs 0Wh
0x7fff
q)0x00 vs 0Nh
0x8000

q一切看起来很熟悉,但k.h nh似乎很奇怪:

// nulls(n?) and infinities(w?)
#define nh ((I)0xFFFF8000)
#define wh ((I)0x7FFF)
#define ni ((I)0x80000000)
#define wi ((I)0x7FFFFFFF)
#define nj ((J)0x8000000000000000LL)
#define wj 0x7FFFFFFFFFFFFFFFLL

为什么它的(I)0xFFFF8000价值nh?- 为什么他们不只是简单地说(H)0x8000

4

1 回答 1

1

我怀疑额外的位用于表示解释器或虚拟机中的空值,以将其与短值 0x8000 区分开来。使用额外的位来存储非整数值允许充分使用 16 位来表示整数。这避免了必须将 0x8000 位模式提升为 32 位值,并提高存储和处理短裤列表的效率。

当您使用vs转换为二进制时,它看起来像强制 16 位输出,屏蔽掉特殊位。但是,这不是特殊值的内部二进制表示,您可以将其0b用作第一个参数。例如:

q)0b vs 0W
0111111111111111111111111111111111111111111111111111111111111111b

我无法访问 aq 提示符来尝试它,0Nh但您可以尝试一下。

这都是推测性的,因为我对 q 实现没有任何特殊知识,但是我已经构建了几个解释器和 VM,这对我来说是有意义的。

于 2020-12-10T02:48:01.887 回答