2.7 变量和数据类型(2)

这节我们继续学习数据类型之间的转换中应该注意到的一些小细节。

数据类型之间的转换有两种:
1.自动类型转换(隐式类型转换)
2.强制类型转换(显式类型转换)

表达式的数据类型自动提升:
所有的byte型,short型和char型的将自动提升为int型;
如果一个操作数是long型,那么计算结果也是long型;
如果一个操作数是float型,那么计算结果也是float型;
如果一个操作数是double型,那么计算结果也是double型;
我们看出占内存小的自动提升为占内存大的数据类型。

而当我们要把占内存大的数据类型转换成占内存小的数据类型时必须要强制转换,当然有可能造成精度降低或溢出,所以在使用时一定要格外注意。

下面我们直接看一段代码,体验一下数据转换中的一些细节。

class VarDemo2 
{
	public static void main(String[] args) 
	{
		int x = 3;
		x = x + 5;//运算两端必须同类型,一般情况下不同类型是不能运算的

		byte b = 5;
		x = x + b;//特殊情况下,两端为数值型,类型会自动提升,以占用内存比较大的为主,占用内存小的类型自动提升

		byte b1 = 3;
		//b1 = b1 + 4;//错误:不兼容类型:从int转换成byte可能会有损失.这里的4是int类型的,相加,b1会自动提升,4个字节存储,不能附值给1个字节的b1
		
		b1 = (byte)(b1 + 4);//强制转换
		System.out.println(b1);
		b1 = (byte)(b1 + 200);//强制转换
		System.out.println(b1);

		System.out.println("a" + 1);//结果是98,计算机里面全部是二进制,01100001对应a(二进制和生活中文字对应关系表,也就是编码表,全称ASCII)
		System.out.println((char)("a" + 1));//b
		System.out.println("你" + 0);//中文对就的是gb2312或者GBK  unicode是国际标准码表
		System.out.println("0" + 0);

		byte b2 = 4;//4还是int类型,在附值过程中会自动检测,并强制转换类型
		b2 = 3 + 7;//这个编译通过,因为3和7是常量,是确定的,可以自动检测

		byte b3 = 3;
		byte b4 = 7;
		//b2 = b3 + b4;//这个编译通不过,因为b1和b2是变量,这两值不确定,不能自动检测,报错说丢失精度
		
		int x0;
		int x1 = Integer.MAX_VALUE;//这个是取int范围的最大值
		int x2 = 2;
		x0 = x1 + x2;
		
		System.out.println(x0);//超出int范围
	}
}

结果如下:

从结果我们很清楚的看到不同数据类型之间的转换结果,以及数据类型的范围溢出等细节问题,在以后的学习中更加注意。

文章导航