/**
 * 
 * 转换基本数据类型
 *
 */
public class ChangeBasicType 
{
	/**
	 * 基本类型的数据提升
	 */
	private void typeAutoUpgrade()
	{
		byte b = 44;
		char c = 'b';
		short s = 1024;
		int i = 40000;
		long l = 12463l;
		float f = 35.67f;
		double d = 3.1234d;

		/*
		 * (f * b)时,b自动提升为float类型
		 * (l*f)时,l自动提升为float类型
		 * (i/c)时,c自动提升为int类型
		 * (d*s)时,s自动提升为double类型
		 * 再相加时,中间结果都变为了double类型。
		 * 这里result只能声明为double类型,result声明为其他类型会出错,除非进行强制类型转换
		 */
		double result = (f*b) + (l*f) + (i/c) - (d*s);
		System.out.println((f*b) + " + " + (l*f) + " + " + (i/c) + " - " + (d*s));
		System.out.println(" = " + result);
	}

	/**
	 * 基本类型的自动转换
	 * 自动类型转换发生的条件是:
	 * 1:两种类型是兼容的
	 * 2:目标类型的范围比源类型的范围大
	 * 其他情况下,必须进行强制类型转换
	 */
	private void autoChange()
	{
		char c = 'a';
		byte b = 44;
		short s0 = b;
		int i0 = s0;
		int i1 = c;
		long l = i0;
		float f = l;
		double d = f;
		System.out.println("c = " + c + "; b= " + b + "; s0 = " + s0);
		System.out.println("i0 = " + i0 + "; i1 = " + i1 + "; l = " + l);
		System.out.println("f = " + f + "; d = " + d);

		/*
		 * 当float类型转换成double时,会出现不等的情况,这是因为,float的范围是
		 * 32位,而double的范围是64位,在进行类型转换时,操作的实际上都是二进制
		 * 数,有些实数用二进制能够精确表示,而有些实数无论用多少位二进制都无法表示
		 * 这与有理数和无理数概念一样。
		 * 对不能精确表示的实数进行类型转换时,会出现不相等的情况。
		 */
		float f1 = 1.7f;
		double dou = f1;
		System.out.println("f1 = " + f1 + "; dou = " + dou);
		//但是当把一个数从一种类型转换成另外一种类型后,再转换回来时,值还是一样
		f1 = (float)dou;
		System.out.println("f1 = " + f1 + "; dou = " + dou);
	}

	/**
	 * 强制类型转换
	 * 当两种类型不兼容,或者目标类型范围比源类型范围小时,必须进行强制类型转换
	 * 具体转换时会进行截断,取模操作
	 */
	private void forceChange()
	{
		double d = 123.456d;
		float f = (float)d;
		long l = (long)d;
		int i = (int)d;
		short s = (short)d;
		byte b = (byte)d;
		System.out.println("d = " + d + "; f = " + f + "; l = " + l);
		System.out.println("i = " + i + "; s = " + s + "; b = " + b );

		d = 567.89d;
		/*
		 * 下面的转换首先进行截断操作,将d的值变为567,因为567比byte的范围256大。
		 * 于是进行取模操作,567对256取模后的值为55
		 */
		b = (byte)d;
		System.out.println("d = " + d + "; b = " + b);
	}

	public static void main(String args[])
	{
		ChangeBasicType cbt = new ChangeBasicType();
		System.out.println("===================基本类型自动提升=====================");
		cbt.typeAutoUpgrade();
		System.out.println("===================基本类型自动的转换====================");
		cbt.autoChange();
		System.out.println("===================强制类型转换=========================");
		cbt.forceChange();
	}
}