是否可以对J
中的数字进行算术运算,并使它们的行为与C语言中的相似?即如果我从一些32位(或64位,我猜)数字开始,是否有任何方法可以添加或减去它们并使它们以C / C ++ / Java中的方式溢出/下溢/环绕?
答案 0 :(得分:1)
因此,处理溢出的一种直接方法是使用Residue(|
):
(2x ^ 32) | 4000000000 + 1000000000
705032704
overflow =: ] |~ 2x ^ [
32 overflow 4000000000 + 1000000000
705032704
您可以使用Base(#.
)和Antibase(#:
)生成值的二进制表示形式:
[ reg =: (32 $ 2) #: 1 2 3 4294967294 4294967295 4294967296 4294967297
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
3 { reg
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
#. 3 { reg
4294967294
#. reg
1 2 3 4294967294 4294967295 0 1
(32 $ 2)&#: #. +/ 0 2 { reg
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
(32 $ 2)&#: #. +/ 0 4 { reg
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
使用Foreign(!:
)系统函数可能有一些更酷的方法,但这些方法超出了我的范围。