假设我
BigInteger n;
我可以在没有溢出的情况下为n分配任何值吗?例如,
p = new BigInteger(512*512*512, 15, new Random());
n=p;
这是因为我制作了RSA alg。有时候它给了我正确的价值,有时候它给了我错误的价值,我想确保我不会溢出某个地方。
如果溢出是问题,我应该,或者我应该如何初始化我的BigInts?
答案 0 :(得分:4)
我可以在没有溢出的情况下为n分配任何值吗?
BigInteger
可以代表什么是有限的。正如javadoc所说:
"
BigInteger
必须支持-2 Integer.MAX_VALUE (不包括)+2 Integer.MAX_VALUE (不包括)范围内的值可能支持该范围之外的值。"
后来,它说:
当结果超出支持的范围时,"
BigInteger
构造函数和操作抛出ArithmeticException
..."
...所以你不会得到未经宣布的溢出(就像使用原始整数类型一样)或类似INF / NaN的值(如浮点类型)。
还有一个问题是,如果堆已满/太小,则创建大BigInteger
会抛出OOME。
如果溢出是问题......
在您的示例中,BigInteger
代码溢出不是问题所在。你会看到某种例外情况。
此外,512*512*512
表达式不会溢出。 (但一般来说,你可能会在构造函数参数表达式中出现溢出...因为这些计算通常是使用原始整数运算来完成的,它会以静默方式溢出。)
(迂腐......赋值n = p;
是一个引用赋值,不能溢出或抛出OOME .AFAIK,它无法在Java模型的上下文中失败。你和#39; d需要硬件错误,电源故障,堆损坏,代码生成错误等......)
答案 1 :(得分:2)
既然你在谈论RSA算法,我怀疑这是你真正想写的代码:
Random rand = new Random();
BigInteger p = new BigInteger(512, 15, rand); // A random prime
BigInteger q = new BigInteger(512, 15, rand); // Another random prime
BigInteger n = p.multiply(q); // The product of the two primes