版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhoushuilin/article/details/80912302
/** * Created by ZHOUSHUILIN140 on 2018/6/14. */ object Variable { /** * 学习如何定义变量, 如何定义常量 * @param args */ def main(args: Array[String]): Unit = { // var 变量名称:数据类型=初始化值 var a:Int=2147483647 //占4个字节, 一个字节是8位, 也就是说Int的最大值不能超过2的31次方 -1 //2的31次方=2147483648 //var b:Long=2147483648 , 这个感觉挺出乎我们的意料的,我们不是说Long的8个字节吗,那8个字节 //应该会占有64位,也就是2的63次方-1,那为什么还报错呢 , 这里其实隐藏了一个知识,我们讲过了, //数值类型的默认值是int , 那你这个值其实已经超过了Int的范围了,那肯定编译的过程中就会报错, //这样做容易损失精度,那你定义为Long类型该怎么办呢? 我们可以在后面加一个L来表示,其实加l也可以, //但是l容易引起不必要的错误, var b:Long=2147483647 //那同理, 我们在用小数点的类型的时候,也就是浮点类型的时候,因为默认的值为Double类型,如果从 //double转到Float的时候,可能会损失精度,所以我们一般加上F或者f, 一般都统一用大写F var aa:Float=12.345F var c:Byte=10 var d:Int=2147483647 println(c) //var e:Byte = c + d 这样做是不对的,因为你Int转换到Byte的时候,容易损失精度,你Int能容纳下的数据范围肯定比Byte大, //加上以Byte之后,很有可能就超过了Byte的范围,所有这个时候,默认不能转换, 那这种问题是否能够解决呢,可以,只要你确定 //你用Byte能够存放的下,那么我们可以强制性把Int转换为Byte ,大家思考一个问题,那如果说 //d的值为2147483647的时候,你强制性转换为Byte,这个时候已经超过了Byte的范围了,那这个时候会出现什么情况呢, 那肯定会出现 //错误的结果 //注意: //不要随意的去使用强制转换,因为它隐含了精度损失问题。 var e:Byte = (c + d).asInstanceOf[Byte] //var e:Int=c +d //println(b) println(e) //默认转换(从小到大的转换) //A:byte,short,char—int—long—float—double //B:byte,short,char相互之间不转换,他们参与运算首先转换为int类型 /** * 好,那我问大家一个问题, var a:Byte=1 var b:Byte=2 var c:Byte=4 那我想问一下, c = a + b会不会报错 var d:Int=5 那我再想问一下,d = a + b是不是会报错 */ var f:Byte=1 var g:Byte=2 var h:Byte=4 //h = f + g 是否会编译失败? 如果编译失败,原因是什么? var i:Int=5 i = i + 1 println(i) //i = f + g 是否会编译失败? 如果编译失败,原因是什么? //那h = (f + g).asInstanceOf[Byte] 呢? /** * h = f + g会编译报错, i = f + g编译不会报错,我们前面讲了,byte,short,char相互之间不转换,他们参与运算首先转换为int类型 也就是说,f和g在做运算的过程中,都会自动的转换为Int类型,那Int类型的话,数据范围比Byte大,不能自动转换为Byte ,Int类型再赋值给 Byte类型,可能会有损精度,会导致编译报错。 */ } }