1。java中,long型是64位的,float型是32位的。为什么long型转float型,编译器没有报“possible loss of precision”这个错误呢?(比如float a = 100L;)网上有人说是因为float型虽然是32位的,可是其中有部分表整数,其他表指数,在表指数的位的影响下,float型的范围当然就比较容易变大(实际float表示的范围确实比long大)。然后就因为范围大,所以编译器就隐式转换了???可是在《SCJP考试指南》中,看见作者说“变量其实是容器,容器中有n个位(n即为该基本类型的位数)”,那么32位的float容器又怎么容得下64位的long数据呢???两种说法好像都有道理啊那么,基本类型赋值中可能涉及到的强制或隐式类型转换的场景中,判断的关键在哪里?是根据“范围说”还是根据“容器说”?2。还有long是8字节的,那么为什么给long a = 9223372036854775807(2^63-1),会报“过大的整数”这个错?事实上,赋
2147483647(2^31-1)才刚刚好,哪怕再大1,就报这个错了,为什么呢?那这个8字节岂不是只用了4字节?

解决方案 »

  1.   

    1.浮点数是不能精确表示数值的,而整数是可以精确表示的。比如整数,1,2,3,4,5,你可以这样的遍历出来,而浮点数则不可以,你不可能用固定的位数,比如四字节或者八字节把1.1,1.11,1.111,所有的东西都表达出来。所以,你可以看一下float能表示的范围很大,但很多数十无法精确表示出来的,举个例子,
    float f1 = 2000000000;
    float f2 = 2000000050;
    后者比前者看起来大50,但实际表示效果如何呢?可以测试一下。
    (看起来是两个数,但映射到float,可能是一样大的。)
    估计大二或者大三会开计算机组成原理之类的课程,到时候就都明白了。2.还有负数呢。
      

  2.   

    long ab = new Long("9223372036854775807");
    你用它的构造方法不就行了吗。因为你long a = 9223372036854775807的右边是等于把一个int型的值赋值给了long把以肯定会出现out of range的错误吗
      

  3.   

    long a = 9223372036854775807L