可以在J中添加包含环绕的32位整数吗?

时间:2015-01-21 18:13:04

标签: math int j

是否可以对J中的数字进行算术运算,并使它们的行为与C语言中的相似?即如果我从一些32位(或64位,我猜)数字开始,是否有任何方法可以添加或减去它们并使它们以C / C ++ / Java中的方式溢出/下溢/环绕?

1 个答案:

答案 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(!:)系统函数可能有一些更酷的方法,但这些方法超出了我的范围。