[英]NULLs in q and in k.h
我發現kh
和q
之間的h
NULL 值不同:
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
看起來很熟悉,但在kh
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
我無法訪問 aq 提示來嘗試0Nh
但您可以嘗試使用它。
這都是推測性的,因為我對 q 實現沒有任何特殊知識,但我已經構建了幾個解釋器和 VM,這對我來說很有意義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.