1B(字节) = 8bit ---------> 0000 0000
在Java中默认类型 : 型整数为 int , 小数为 double
数据类型 |
关键字 |
内存占用 |
取值范围 |
字节型 |
byte |
1个字节 |
-128至127 |
短整型 |
short |
2个字节 |
-32768至32767 |
整型 |
int(默认) |
4个字节 |
-2^31^至2^31^-1 |
长整型 |
long |
8个字节 |
-2^63^至2^63-1 |
单精度浮点数 |
float |
4个字节 |
1.4013E-45至3.4028E+38 |
双精度浮点数 |
double(默认) |
8个字节 |
4.9E-324至1.7977E+308 |
字符型 |
char |
2个字节 |
0至2^16^-1 |
布尔类型 |
boolean |
1个字节 |
true , false |
自动转换:将取值范围小的类型自动提升为取值范围大的类型
在Java中 , 整型的默认类型为 int , 所以在进行变量运算过程中, a 和 b 会自动提升为 int 类型的数据 , 得出来的结果自然也是 int 类型 , 使用 byte x = a + b; 会报错.若想坚持使用 byte类型可进行强制转换 -- byte x = (byte) (a + b);
public static void main(String[] args) {
int a = 1;
byte b = 2;
// byte x = a + b; ---> 报错
//int类型和byte类型运算,结果是int类型
int y = a + b;
System.out.println(y);
}
转换规则
范围小的类型向范围大的类型提升,byte、short、char
运算时直接提升为int
。
byte、short、char-->int-->long-->float-->double
强制类型转换:将取值范围大的类型强制转换成取值范围小的类型
比较而言,自动转换是Java自动执行的,而强制类型转化需要我们自己手动进行
转换格式 : 数据类型 变量名 = (数据类型) 被转数据值;
数据类型 变量名 = (数据类型)被转换数值;
// double类型数据强制转成int类型,直接去掉小数点。
int i = (int)1.5;
同样道理,当一个short
类型与1
相加,我们知道会类型提升,但是还想给结果赋值给short类型变量,就需要强制转换。
public static void main(String[] args) {
//short类型变量,内存中2个字节
short s = 1;
/*
出现编译失败
s和1做运算的时候,1是int类型,s会被提升为int类型
s+1后的结果是int类型,将结果在赋值会short类型时发生错误
short内存2个字节,int类型4个字节
必须将int强制转成short才能完成赋值
*/
s = s + 1;//编译失败
s = (short)(s+1);//编译成功
}
强烈注意:
1.浮点转成整数,直接取消小数点,可能造成数据损失精度。
2.int
强制转成short
砍掉2个字节,可能造成数据丢失。
// 定义s为short范围内最大值
short s = 32767;
// 运算后,强制转换,砍掉2个字节后会出现不确定的结果
s = (short)(s + 10);