final long a=10*60*60*1000*100;
     final long b=10*60*60*1000*1000;     System.out.println(a);       // 结果:-694967296
     System.out.println(b);       //结果:1640261632     有没有人知道为什么会出现这样的结果?

解决方案 »

  1.   

    是不是和long的取值范围有关啊?
    long取值范围是-2147483647 到2147483647
    好像超出这个范围了
    个人看法..
     
      

  2.   

    我算了下 第一个数是  3,600,000,000
    long 的好像是       2,147,483,647 
    正好...溢出.
    java的数字...在内部用2进制表示时,左数第一位是符号位,因为java没有无符号类型.
    所以第一位是0就是正,是1表示负.那么当数字大小刚好溢出时,他一定变成负的...
    但是大很多时...就溢出了好多次了...就有可能变回来了.
      

  3.   

        这个问题我自己一开始就想到了,但我感觉不是的,请你们用Long.MAX_VALUE看一下long的最大取值范围是多少
    就算有Integer的取值范围也大于这个结果,我觉得不是你们说的那样.   还有另外的答案吗?
      

  4.   

    越界了,你使用bigint 类型试用一下
      

  5.   

    final long a = 10*60*60*1000*100; 10*60*60*1000*100 = 3600000000二进制位为:1101 0110 1001 0011 1010 0100 0000 0000这个 int 类型,由于高位符号为 1,因此是个负数,它的值是:101 0110 1001 0011 1010 0100 0000 0000 取反加 1 再添负号:010 1001 0110 1100 0101 1011 1111 1111 = 694967295-(694967295 + 1) = -694967296因此,32 位 int 类型数:1101 0110 1001 0011 1010 0100 0000 0000 = -694967296同理:10*60*60*1000*1000 = 3600000000036000000000 = 1000 0110 0001 1100 0100 0110 1000 0000 0000低 32 位为:0110 0001 1100 0100 0110 1000 0000 0000这个 int 类型高位符号为 0,因此是个正数,直接计算,它的值是:1640261632
    正确的写法应为:final long a = 10L * 60 * 60 * 1000 * 100; 
    final long b = 10L * 60 * 60 * 1000 * 1000; 
      

  6.   

    Java 整数计算中,默认的是 int 类型,而这个类型的数据宽度为 32 位,
    当计算结果超出它所能表示的范围时,保留低 32 位的值,就把超过 32 位
    的数据给扔掉,这时称为溢出。