基础小白努力学习java,希望日后成为编程大牛!
在学习JAVA的强制转换类型之前,我们要先了解有哪些变量的数据类型。
而今天我们主要学习整数类型和浮点类型的类型转化。
1.整数类型变量
2.浮点类型变量
当了解了4种整数类型变量和2种浮点类型变量的存储空间的大小及取值范围。接下来就进入今天的变量类型转换:
1.自动类型转换
定义:隐式类型转换,两种数据类型在转换过程中不需要做出任何的声明,由编译器自动完成。
条件:①两种数据类型彼此兼容
②目标类型的取值范围大于源类型的取值范围
(都要满足)
3种可进行交换的情况:①整数类型之间的转换。byte->short、int、long;char->int、long;int->long
②整数类型转换为float类型:byte、char、short、int->float
③其他类型转换为double类型:byte、char、short、int、long、float->double
以下举几个简单的例子:
byte转换成int
输出为:
int转换成float
得到的输出就是这样的:
char转换成double
得到输出:
由于a是char类型的,所以赋给a的值要转换为ASCLL码,再转换成double类型。
2.强制转换类型
定义:显示类型转换,两种数据类型之间的转换需要进行显式声明。
条件:①两种数据类型彼此不兼容
②目标类型取值范围小于源类型,自动转换无法进行
(二者择其一)
先看一个错误例子
程序会报错:类型范围大的数据或变量不能直接赋值给类型范围小的数据或变量。
因此,我们就要学习强制转换的格式:
目标类型 变量=(目标类型)值 (so easy)
这时,我们来重新修改上面的栗子:
程序就不会报错。
然而我们有时候会不小心就编写一个超出变量范围的代码:
得到输出:
为什么会出现这种情况呢?那是因为byte类型的范围是[-128,127],但i的输入超过了它本身的范围。1500的二进制为0101 1101 1100,计算机把最高位作为符号位(1-负数 0-正数),所以0101 1101 1100肯定是一个负数。计算机存储的是补码,而负数的补码 = 其对应正数按位取反 + 1。其次,byte是一字节,存储8位二进制,因此高位0101将会被舍去。最后1101 1100按位取反是0010 0011,再把0010 0011进行+1操作,就是0010 0100(36)。所以最终结果是:-36。
数据精度损失:在对变量进行强制类型转化时,如果将取值范围大的数据类型强制转化为取值范围较小的数据类型,极易造成数据精度损失。
精度损失之“四舍五入”:
“五入”:
“四舍”:
最后一个小tip:在使用+=、-=、×=、/=、%=这些运算符进行赋值时,强制类型的转化会自动完成,程序不需要做任何显示声明。
举个例子:
得到结果:
若有不对,请指正,谢谢!
最后,附上我喜欢的句子鼓励每一个热爱编程的人:勤奋,是一种最简单的人生投资。