q 和 k.h 中的 NULL
NULLs in q and in k.h
我发现 h
NULL 在 k.h
和 q
之间有不同的值:
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
为什么 nh
的值是 (I)0xFFFF8000
? - 为什么他们不简单地写 (H)0x8000
?
我怀疑额外的位用于表示解释器或虚拟机内部的空值,以将其与短值 0x8000 区分开来。使用额外的位来存储非整数值允许充分使用 16 位来表示整数。这避免了必须将 0x8000 位模式提升为 32 位值,并使其更有效地存储和处理短裤列表。
当您使用 vs
转换为二进制时,看起来它强制输出 16 位,屏蔽掉特殊位。但是,这不是特殊值的内部二进制表示,您可以使用 0b
作为第一个参数来查看。例如:
q)0b vs 0W
0111111111111111111111111111111111111111111111111111111111111111b
我无法访问 q 提示来尝试 0Nh
,但您可以尝试一下。
这都是推测,因为我对 q 实现没有任何特殊知识,但我已经构建了几个解释器和 VM,这对我来说很有意义。
我发现 h
NULL 在 k.h
和 q
之间有不同的值:
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
为什么 nh
的值是 (I)0xFFFF8000
? - 为什么他们不简单地写 (H)0x8000
?
我怀疑额外的位用于表示解释器或虚拟机内部的空值,以将其与短值 0x8000 区分开来。使用额外的位来存储非整数值允许充分使用 16 位来表示整数。这避免了必须将 0x8000 位模式提升为 32 位值,并使其更有效地存储和处理短裤列表。
当您使用 vs
转换为二进制时,看起来它强制输出 16 位,屏蔽掉特殊位。但是,这不是特殊值的内部二进制表示,您可以使用 0b
作为第一个参数来查看。例如:
q)0b vs 0W
0111111111111111111111111111111111111111111111111111111111111111b
我无法访问 q 提示来尝试 0Nh
,但您可以尝试一下。
这都是推测,因为我对 q 实现没有任何特殊知识,但我已经构建了几个解释器和 VM,这对我来说很有意义。