我刚开始学java,很多概念性的东西不是很理解。
如: short(或者是byte、char)b = 1;这一句为什么不像 float f = 1.2 那样会报精度损失错误?此处的 1 不是自动提升为int类型吗,而int类型赋值给short类型,即大类型赋值给小类型,应该会损失精度的吧?
同时,我改成int a = 1;short b = a;这一句却会报精度损失错误。怎么理解两种表达方式的差别?或许这个问题对于你很小白,还希望哪位能详细地说一下,不甚感激!

解决方案 »

  1.   

    short b = 1; 只要后面这个数(直接用数字表示的,而非变量)在short表示的范围之内,就可以直接赋值。
      

  2.   

    谢谢 那请问float f = 1.2 为什么报精度损失错误 1.2也没有超出float的范围吧?
    或者说此处的1.2会提升到double类型,所以大赋小会损失精度?
    那么数据类型自动提升的规则是不是还要分整形和浮点类型讨论?(a = b 在b为数值,非变量的情况下)
      

  3.   

    short和int都是能精确表示数据的。但double和float不可以。
      

  4.   

    这个不是很清楚,感觉与每种数据类型的二进制存储机制有关吧;
    需要高精度计算的数据,比如金额、产量等的计算,最好不要用float、double,用bigdecimal;
      

  5.   

    a=数值  就是一个简单赋值
    a=b    b的类型看你定义的是什么,赋值的过程中还存在类型匹配转换
      

  6.   

    下午去查了下,关于JVM中数据处理有这样一段话:
    在 Java 语言中,byte、short、与 char 型态就和整数、浮点数一样,有着相同的地位。但是,在 JVM 中,byte、short、与 char 不过是「次级公民」,指令的支持程度不及 int 和 float 的完整。你可以宣告有某字段储存一个 byte、short、或 char 的资料,用处理 byte、short、或 char 的相关指令来建立或处理。然而,当你取出此 byte、short、或 char 的字段值时,它们就会自动转型为 int 型态,然后你的程序取得的是 int 值。(这里说的应该就是自动提升的底层原理)
    相反地,当你指定某值给 byte、short、或 char 的字段时,你传给 JVM 的是 int,但是它会自动被截短为适当的体积。你也可以使用 i2s、i2b、i2c 来截短,使其值在对应型态的合理值范围内(i2s 用来截短成 short、i2b 用来截短成 byte、i2c 用来截短成 char )。(这里就解释了我的问题
      

  7.   

    引用 2 楼 tk_peter 的回复:
    谢谢 那请问float f = 1.2 为什么报精度损失错误 1.2也没有超出float的范围吧?
    或者说此处的1.2会提升到double类型,所以大赋小会损失精度?
    那么数据类型自动提升的规则是不是还要分整形和浮点类型讨论?(a = b 在b为数值,非变量的情况下)
    顶,不过我们用float f=1.2f这样表示才行的
      

  8.   

    如12樓說的,如果不寫f的話,計算機默認是自動轉成double類型,這樣就會造成數據損失