这是Java的基本数据类型,但是如果要进行数据类型直接的转换。

上图是一个Java基本数据类型之间的转换,是自动发生的过程。但此时会有一个疑问,为什么long可以转化位float类型?long在内存中是占用8位,而float占用4位,为什么可以强制转换,查看一下long的定义就明白了,long是(-2^63,2^63-1)的整形,而float的定义是位符来的,第1位是符号位,表示正负,接下来第2位到第9位表示指数,接下来23位表示尾数。这就表明float表示的范围比long的范围大很多,只是精度不够。

现在又来了一个问题,如果我们在这个表的右边转化到左边,此时发生了强制类型转换。如何结果这个问题呢?

Java中强制类型的语法格式是:(targetType)value。

package Collection;

public class NarrowConversion {

	public static void main(String[] args) {
	   int int1=514;
	   //进行强制类型转换,强制类型转换语法是(targetType)value
	   byte byte1=(byte)int1;
	   System.out.println(byte1);
     //此时输出结果是2

	}

}

  此时为什么会出现这种结果,我们要来看看int1=514在计算机中是什么了,514在计算机中是10_00000010,但是byte只有8位,那么他截取的就是00000010,这是原码,直接转化位byte对应的数值就是2,所以输出结果就是2。

在看看这个:

package Collection;

public class NarrowConversion {

	public static void main(String[] args) {
	   int int1=514;
	   //进行强制类型转换,强制类型转换语法是(targetType)value
	   byte byte1=(byte)int1;
	   System.out.println(byte1);
       //此时输出结果是2
	   int int2=393;
	   byte byte2=(byte)int2;
	   System.out.println(byte2);
	   //此时输出-119

	}

}

  我们来看int2,为什么输出结果是-119,我们首先对int2来进行解析,393换成2进制是110001001,但是byte只能截取10001001,我们看第一位,第一位是符号位1,表明这个数是负数,而负数在计算机中是以补码的形式存在,补码要转换为原码,首先得转化位反码,再转化位原码, 补码减一就是反码(负数的反码=负数的原码各位取反,负数的补码=负数的反码+1;正数的原码、反码、补码全部一样)。100011001是以补码形式存在,那么他的反码就是10001000,那么原码就是11110111;输出结果就是-119。

 

   表达式类型的自动提升

  1 所有的byte类型、short类型和char类型将被提升到int类型

  2 整个表达式的数据类型自动提升到与表达生中最高等级操作数相同的类型。