Java 基础类型的细节
Java有七个基础变量:
整型:byte(8位,默认值:0),short(16位,默认值:0),int(32位,默认值:0),long(64位,默认值:0);
浮点型:float(32位,默认值:0.0),double(64位,默认值:0.0);
char型:(16位,默认值为空);
boolean型:(只有false和true,默认false);
那么一个数在内存中具体是怎么存储的呢?
在Java中,是以补码的形式存储数字,再根据自己的类别决定位数。如:byte a = 3;则在内存中具体的体现就是:0_000_0011;因为a是byte类型,所以它只占8位。并且基础类型里,除了char、boolean之外,其他的类型都具有正负,所以第一位是符号位。这样就可以得出具体基础类型的变量范围:
byte:-2^7 ~ 2^7-1;
short: -2^15 ~ 2^15 - 1;
其他整型类别范围以此类推...
但是char类型是没有正负的那么范围就是:0~2^16-1
接下来就有一个问题,就是我们在定义一个基础变量时,如果只有声明,没有定义。例如:int a 那么我们打印出a会是什么结果呢?是int的默认值还是null?
为避免编译器不同带来的差异,我们直接用java命令编译执行文件
如图:
这里只声明了a,并没有赋值,再看编译结果:
可以看到,这里jvm直接都无法通过编译,所以以后遇到笔试题,就可以很好的解决了。
接下来我们再来看不同类别之间的转换和计算:
转换规则:理论上,除了boolean类型,其他的基本类型之间都可以相互转换(强制转换和非强制转换):
整形之间的转换:
位数低的变量可以值不变的向位数高的类别转换。如:byte 可以向short值不变转换,short可以向int转换等等。
位数高的变量向位数低的类别转换,会直接取位数高的数值的第n位n(代表低位类别的位数),如:
查看Short.MAX_VALUE的值:
二进制表示为:0111_1111_1111_1111;
那么b的值就应该是上面一个二进制数的低8位:1111_1111;
注意这是补码显示,而且是有符号位的(1表示复数),所以符号位保持不变,其他位取反加1得到:1000_0001;在转化为十进制数就是-1;
接下来看程序打印的结果:
与我们计算的相同。
float与double的转换比较复杂,这里不详细讨论
再看char转化为整型,char是通过比较一个表(unicode编码表)来确定它的值。比如:
char a = ‘经’;
int i = a;
这里打印出i,就会得到”经“这个汉字在unicode编码表所对应的数字
至于转换成byte还是其他整数类型与int一样。
float、double转化成整型变量时,只需要获得被转换数字的整数部分就行了。
最后再来看基础类型之间的计算:
如byte int short float等之间经行计算时,需要根据所计算的变量类型来决定将转化成某些类型:
规则:
如果计算部分包含double,则将所有部分全部转化成double
如果计算部分包含float(不包含double),则将所有部分转化成float
否则,会全部做转换成int类型开始计算,并且计算结果也全部是转换后的类型:
如:
char a = ‘1’;
char b = '2'
char c = a+ b;//会编译错误。
应该是:
char c = (int) (a+b);