数据类型
java数据类型分为基本类型和引用类型两种
- 基本类型
整形(byte,short,int,long),字符型(char),布尔型(boolean),浮点型(double,float) - 引用类型
类,接口,数组
类型转换
在基本类型中,类与类可以互相转换,但也不是所有的类都可以转换的。比如布尔型就不能转换为其它类型。
转换规则分为自动转换和强转。
在计算机中,所有数据都是以二进制的形式,也就是0和1保存在电脑里的,
以整形为例,byte在内存中占一字节,short占2字节,int占4字节,long占8字节。所谓的内存占位也就是值在内存中所占二进制的位数,如byte型的8,内存中的表示形式为0000 1000;short型则为0000 0000 0000 1000;
类型转换也就是内存中所占位数的转换,即位数的扩充与收缩。低位数转高位数也就是位数扩充,如byte型转short型,也就是由8位二进制数保存的数字变成16位而已。因为不同类型的数其二进制的位数不同,所以它们的取值范围也不同,表中列出了不同类型的整数的取值范围。
低位的类型转为高位在系统中是自动转换的,但高位转为低位需要强制转换,也就是说在系统中是不推荐高位转低位的。其原因是高位转低位是会造成数据丢失的。比如说short转int,short为16位,int为32位,它们的转换也就是位数的扩充,也就是把16位扩充为32位。其规则就是在原16位前面加上16位,因此低位转高位是不会造成数据丢失的,但低位转高位不一样。如short转byte。如short型的128,其二进制形式为0000 0000 1000 0000,转为byte型也就是位数收缩为8位,如何收缩呢?是截前面8位还是后面8位呢?还是说随便截8位呢?如果不是截前面8位,不管怎么截,它们的表示的数字都会变,但截前面8位就不会变吗?那byte型为什么取值范围不包括128呢?
首先这里要讨论下byte型的取值范围问题,8位的二进制其取值范围为0 ~255,但在byte中为什么有负数呢?这是因为在计算机中以负数的绝对值的补码来记录这个负数,然后造成的就是最高位还是符号位,最高位为0表示正数,1表示为负数。然后8位的取值范围就变为了-128 ~127。
回到列子中,short型的128转为byte型,看起来其二进制大小没变,但它的最高位却变为1了,也就是说这个数变为负数了,这就是高位转低位经常会遇到的问题。高位转低位其值一旦超过低位的取值范围,强转就会造成数据丢失,所以系统不推荐高位类型转低位类型,但也没禁止,会不会造成数据丢失,也就是是否超出取值范围就需要人工判断了。