数据类型转换
一.Java中的八种基本数据类
1.整数:byte、short、int、long
2.小数:float、double
3.字符:char
4.布尔:boolean注意:字符串的类型String不是基本数据类型,而是引用数据类型。单引号引起的是字符,双引号引起的是字符串,如果双引号中没有内容是属于一个空的字符串。
二.声明变量的方式
1.方式一:数据类型 变量名=数据;
2.方式二:数据类型 变量名1,变量名2,……;
三.数据类型转换
(一).数据类型转换的方式(2种)
1.自动类型转换(也叫隐式类型转换):小数据类型——————>大数据类型
class demo1{ public static void main(String[] args){ byte b = 11; short s = b; int i = s; long l = i; System.out.println(l); } }
注解:byte是1个字节,占8位;short是2个字节,占16位;依次类推,int是4个字节,long是8个字节。
可以形象地理解为byte是一个可以装下一两水的碗,short是一个可以装下二两水的碗;把b变量存储的值赋予给s变量后,之前一两的碗 能装下的数据换一个二两的碗依然能装下这么多数据。
2.强制类型转换(也叫显式类型转换):大数据类型——————>小数据类型
class demo2{
public static void main(String[] args){
int i = 128;
byte b = i;
System.out.println(b);
}
}
运行结果如下图所示
注解:我们发现此程序在编译时就会报错,可能会损失精度。那是因为int数据类型占了4个字节,而byte数据类型只占了1个字节,不可以将一个数值赋给一个比它的数值范围更小的一个变量,除非进行类型转换。就好比把大容器中装的水往小容器倒一样,小容器就会出现溢出。正确的做法是要进行强制类型转换,如下:
class demo2{ public static void main(String[] args){ int i = 128; byte b = (byte)i; System.out.println(b); } }
运行结果如下图所示:
强制类型转换的工作原理:强制类型转换在内存中实际上相当于把i的低8位全部取到byte中,如果前面还有数据就不要了。但是此时还有一个疑问,byte数据类型占一个字节,那么理所应当它最大能装到127,但是结果是-128并不是127,这时候就要清楚负数在计算机中是如何存储的。
(二).负数的存储原理
1.负数的存储原理图
所以,如果是负数,那么最高位肯定是1,正数的二进制数的最高位是0。当然,sun也给我们提供了一个功能Integer.tobinaryString()可以查看一个数据的二进制形式。
运行结果如下图所示:class demo3{ public static void main(String[] args){ System.out.println(Integer.toBinaryString(-7)); } }
2.-128的由来
(三).强制类型转换注意细节:
1.凡是byte、short、char数据类型的数据在运算的时候都会自动转换成int类型的数据再进行运算。
例1:如果不强制类型转换就会在编译时报错
(1)错误的程序以及运行结果
class demo4{ public static void main(String[] args){ byte b1 = 1; byte b2 = 2; byte b3 = b1+b2; System.out.println(b3); } }
(2)强制转换后的程序以及运行结果
class demo4{ public static void main(String[] args){ byte b1 = 1; byte b2 = 2; byte b3 = (byte)(b1+b2); System.out.println(b3); } }
例2.
class demo5{ public static void main(String[] args){ System.out.println('a'+1); } }
2.两个不同数据类型的数据在运算的时候,结果取决于大的数据类型
例2
class demo6{ public static void main(String[] args){ int i = 10; long l = 20; i = (int)(i+1); //结果是int类型,用int类型接收需要强制类型转换 System.out.println(i); } }
例3 为什么demo7不会报错而demo8却会报错?
(1)demo7的程序和运行结果
class demo7{ public static void main(String[] args){ byte b = 10; System.out.println(b); } }
(2)demo8的程序以及运行结果
class demo8{ public static void main(String[] srgs){ int i = 10; byte b = i; System.out.println(b); } }
注解:
(1)在demo7中确实不会报错,一个整数没有加任何标识的时候默认是int类型的数据,大类型的数据往小类型的数据转换理论上是会报错的,但是10是一个常量,编译器在编译的时候就能够确认常量的值了,在编译到byte b = 10;的时候,java编译器就会检测到10并没有超出byte的表示范围,所以允许赋值。(2)在demo8中一定会报错,java编译器在编译到第一句int i = 10;的时候,会检查到10这个常量并没有超出int的表示范围,但是并没有把这个值赋予给变量i,只有在执行java命令时,变量才会在内存中分配空间,才可以存储数据。而在编译第二句byte b = i;的时候,对于java编译器来说,在编译的时候i并没有存储值,只能检查出i是一个int型的变量,int类型的变量就有可能会超出byte类型的表示范围,所以此时会报错。
上一篇: 解决vue2.0路由不显示router-view的问题
下一篇: 数据类型转换