如何在超过限制时打印Java int值

时间:2013-06-29 12:01:13

标签: java int overflow

在我的排序程序的Java代码中(使用我的insertionsort算法实现对100000个整数进行排序),我试图找出数组中元素的交换次数。我将其设置为静态变量,因为sort()方法是静态的。

然而,在程序运行期间的某个时候,我认为整数限制被越过,最终计数显示为负数。必须有办法纠正这个问题,并获得数字正确的计数,但我无法弄明白这一点。你可以帮忙吗?

public class InsertionSort {
    private static int exchcount=0;

    public static void exch(Comparable[] a, int i,int j){
        Comparable temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
    public static int exchangeCount(){
        return exchcount;
    }

    public static void sort(Comparable[] a){
    int N = a.length;       

    for(int i=0; i< N;i++){
        for(int j=i; j>0 && less(a[j],a[j-1]); j--){
        exch(a,j,j-1);
        exchcount++;

        }
       }
   }
...

    public static void main(String[] args) {
        Integer[] a = RandomNumberArrayGenerator.generate(100000);
        sort(a);
        System.out.println("number of exchanges="+ exchangeCount());
   }

这给出了

number of exchanges= -1799089211

4 个答案:

答案 0 :(得分:5)

最简单的方法是将计数器变为long而不是int。这将使您最多可以计算9,223,372,036,854,775,807。

如果每个exch()需要一个CPU周期,那么在3GHz计算机上需要大约100年才能使long计数器溢出。

答案 1 :(得分:4)

原始类型int已签名,32位值从-2,147,483,648到2,147,483,647(含)。请参阅java tutorial

如果结束后的值是-1799089211而不是意味着当exchanges达到2,147,483,647时它会变为-2,147,483,648,而不是-2,147,483,647等等......所以你(-2,147,483,648 + 1799089211 - 1)超过限制原始类型int。当然,这种情况假设您的计数器已经溢出一次,但它应该溢出一次以上。

使用long数据类型和(只是肯定)测试溢出计数器。

答案 2 :(得分:1)

每次增加它都可以检查它是否为负数,如果是,则设置溢出为1。您还可以使用另一个整数来跟踪此情况。也许之后将它设置为0。你有机会吗

exchcount++;

进入

    exchcount++;
    if (exchcount<0) {
      overflowcount++;
      exchcount=0;
   }

您也可以使用long,这将允许您的程序使用64而不是32位。

这需要你机会

private static int exchcount=0;

进入

private static long exchcount=0;

这将允许您计入2 ^ 63而不是2 ^ 31

答案 3 :(得分:0)

使用long代替int。这是一个简单的答案。