一.基本数据类型简介
Java有八种四类基本数据类型,其余的都是对象类型。
整型:byte short int long
浮点型:float double
逻辑型:boolean
字符型:char
类型 存储空间
byte 1个字节
short 2个字节
int 4个字节
long 8个字节
float 4个字节
double 8个字节
boolean 1个字节
char 1个字节
对于浮点型:float类型数据带有后缀F,如果没有则默认为double
我们知道,在java中基本类型变量是存储在虚拟机栈中的局部变量表中。其中除了double和long这两种存储空间为8个字节的占用两个变量表空间之外,其他都是占用一个。
二.八种基本类型的转换
Java中,基本数据类型经常需要相互转换
Java中的八种基本数据类型中有七种可以相互转换(除了逻辑型)。
转换分两种:自动转换和强制转换
当把表数范围小(即存储空间小)的类型转换为表数范围大的类型称为自动转换。
这就好比将小瓶子里的水倒入大瓶子里,即使小瓶子里的水装满了,大瓶子也自然装的下小瓶子里的水。
而强制转型便是将表数范围小的类型转换为表数范围大的类型,这样往往会导致精度缺失,甚至数据错误,导致溢出。因为当大瓶子的水比较少的时候,装到小瓶子里是不会溢出的,但是当大瓶子里的水多到一定程度时,自然也就会溢出了。
下面我们来看一下代码:
@Test
public void convertbyteToint() {
// int类型32位 4字节范围:-2^31~2^31-1
int intValue = 129;
// 单字节 8位 范围:-128~127
byte byteValue = (byte) intValue;
System.out.println(byteValue);
}
该程序将输出-127
很明显与我们的intValue:129不是同一个数值。那么为什么会得到-127呢,首先我们知道当把int类型转换为byte类型时,存储空间变为8位,一个字节。当表示一个有符号数时,数值会在-128~127之间。那到底是怎样转换的呢。我们来看一下值为129的int类型是怎样表示的。
000000……….010000001(共32位,int类型32位,首位为符号位,0为正,1为负,其余位, 置为0)
当转化为byte类型时,我们截取最后的低八位:
10000001
我们知道,第一位为符号位,也就是说现在这个为byte类型的数值表示一个负数
我们知道在Java语言C语言等语言中,数值都是以补码的方式存储的。
对于正数,补码就是原码。但是对于负数,补码的计算方式为,对原码,除符号位的所有位数取反,然后加1。
现在我们知道byte所表示的数值的补码是10000001。
我们求其原码的过程就是求补码的补码,因为补码的补码就是原码。
我们计算一下11111110+1=11111111=-127
所以我们的输出值为-127
我们再看一下将double强转为double,这种情况通常会造成精度损失。
@Test
public void convertIntTodouble() {
double d = 3.14;
// 转化时丢失精度
int intValue = (int) d;
System.out.println(intValue);
}表达式类型的自动提升
输出为3,丢失精度。
基于上述的实验,我们知道,我们在进行基本类型转换时,一定要注意可能造成的信息丢失。
自动转型:
当一个算数表达式包含多个基本类型的值时,整个算术表达式的数据类型将发生自动提升。
Java定义了如下的自动提升规则:
1),所有的byte类型,short类型和char类型将被提升到int类型。
2),整个算术表达式的数据类型自动提升到表达式中最高等级操作数同样的类型。
三.基本类型的包装类