long mod opertaion返回一个int Java

时间:2015-12-24 19:00:14

标签: java types casting long-integer modular-arithmetic

所以我使用的是我在维基百科上看到的这种模幂运算算法,对于我来说,它对小数字一直很好。但是当我使用更大的数字(例如700,000000)时,它总是返回0。

public static void main(String[] args) {
    System.out.println(modPow(2L, 7000000000L - 1L, 7000000000L));
}

public static long modPow(long base, long exponent, long modulus) {
    long result = 1L;
    base = base % modulus;
    while(exponent > 0) {
        if(exponent % 2 == 1) {
            result = (result * base) % modulus;
        }
        exponent = exponent >> 1;
        System.out.println(result);
        base = (base*base) % modulus;
    }
    return result;
}

我将问题追溯到结果变量,因为函数循环它具有值:

2
8
128
32768
2147483648
-4854775808
0
0
...0s onward

这清楚地表明结果变量存储为int,但我已将其明确定义为long。我已经尝试将(long)添加到所有计算中,以防它出于某种原因将其转换为int但这不起作用。

这可能是我想念的简单或基本的东西,但我不明白为什么这不起作用。任何帮助是极大的赞赏。

1 个答案:

答案 0 :(得分:2)

String product = ((TextView) args1.findViewById(R.id.label)).getText().toString(); 溢出result * base

long

中添加以下语句
if

你会看到:

System.out.println("result * base = " + result*base);`

请注意,result * base = 2 2 result * base = 8 8 result * base = 128 128 result * base = 32768 32768 result * base = 2147483648 2147483648 result * base = -9223372036854775808 -4854775808 是9223372036854775807