Java可不可以用无符号数字?
偶然碰到下面这个很奇怪的东西,不知道是为什么?请大家试试看看!
这样输出的是正数:
long l=(long) (2.0*1024*1024*1024);
System.out.println(l);这样输出是却是负数:
long l=(long) (2*1024*1024*1024);
System.out.println(l);
有谁可以给我解释?

解决方案 »

  1.   

    哈哈 
    楼主你的 第二个 改成这样 就ok了 ,你在看看结果,明显是超出范围了long l=(long) 2*1024*1024*1024;
            System.out.println(l);为什么 你第一个是整数呢?2.0 是什么 float 所以你前面那个是 float转为long 
    后面这个是int 转成long 溢出了
      

  2.   

    没转的时候就已经溢出了。
    long l=(long) (2*1024*1024*1024);
    计算的时候,(2*1024*1024*1024)的结果按int型算的,2的31次方,已经溢出了。
           
      

  3.   

    long l=(long) (2*1024*1024*1024);
    2*1024*1024*1024是2的31次方,int类型是32位,去掉一个符号位就是31位,正好溢出,所以变为负的了
    long l=(long) (2.0*1024*1024*1024);
    而float类型虽然也只有32位,但是他不是直接存储数据,而是以IEE754的标准存储的,
      1     8               23              位长
      +-+--------+-----------------------+
      |S|  Exp   |  Fraction             |
      +-+--------+-----------------------+
      31 30    23 22                    0    位编号 
    S为符号位,Exp为指数位,Fraction为有效数位,float是以指数的形式存储数据,所以他的范围比同为32位的int大的多,所以不会溢出,所以转为64位的long时,为正