基础数据类型总结:java
1、八中基础数据类型占用字节编码
类型spa |
占用字节code |
取值范围orm |
默认值xml |
封装类blog |
boolean内存 |
1位(不是一个字节)ci |
true/falseit |
false |
Boolean |
char |
2 |
0~65535 |
\u0000 |
Character |
byte |
1 |
-128 ~ 127 |
0 |
Byte |
short |
2 |
-32768 ~ 32767 |
0 |
Short |
int |
4 |
+-21亿左右 |
0 |
Integer |
long |
8 |
+-2的63次方 |
0L |
Long |
float |
4 |
+-10的+-38次方 |
0.0f |
Float |
double |
8 |
+-10的+-308次方 |
0.0d |
Double |
2、进一步解析:
一、boolean类型不能跟其余类型进行转换;
二、 char类型用来表示Unicode编码表中的字符,参与运算时能够当成整数来用;
举例:
char a = 'a';
int d = a + 3;
System.out.println(d); //输出值为:100
若是要将a+3的值变为字母,能够这么作:
System.out.println((char)d);
三、整数型的值默认类型为int,但:
byte b = 1; //表达式正确
short s = 2; //表达式正确
byte b2 = 200;//错误,200超过了byte的取值范围;
short s2 = 70000; //错误,70000超过了short的取值范围;
解释:整数类型数值默认为int,但在没有超过所赋值的变量的取值范围时,能够正常赋值,超过所赋值的变量的取值范围则报错;
四、若是整形数值大于int的最大取值范围,则数据值加 L;
int i1 = 2200000000;//错误,超过了int的取值范围
int i2 = 2200000000L;//错误,Long类型超过了int范围
long i3 = 2200000000L;//正确
五、浮点型默认为double,小数据类型必须加 f;(double取值范围> float)
//如下表达式均正确,由于:精度高的不能赋给精度低的,精度低的能够赋给精度高的。
//因此double d8=1.0f是能够的,double d2=1也是能够的
//至于double d5=1D,能够理解为变量d5的值是1, D是双精度数的后缀,而后再将值赋给d5
double d1 = 1; //正确,默认为int,int自动转换为double
double d2 =1.0;
double d3 = 1d;
double d4 = 1.0d;
double d5 = 1D;
double d6 = 1.0D;
double d7 = 1.0f;
double d8 = 1.0F;
float f1 = 1;//正确,默认为int,int自动转换为float
float f2 = 1.0;//错误,默认为double
float f3 = 1f;
float f4 = 1.0f;
float f5 = 1F;
float f6 = 1.0F;
float f7 = 3L;//正确,由于long类型容量没有float大
3、基本数据类型转换:从容量小的类型到容量大的类型的转换为自动类型转换,把容量大的数据类转赋值给容量小的数据类须要强制类型转换 (是容量,即取值范围,不是字节占用大小):(低)byte、short、char->int->long->float->double(高)
解读:
一、byte类型数据能够自动转换成short类型;short类型数据和char类型数据之间相互转换只能强制类型转换,由于它们虽然内存占用相同可是表数范围不同(short是-32768~ 32767,char是0~65535)。
二、在参与计算的时候,byte、short、char之间计算不会互相转换,而是转换成int再计算,即便是同类型间计算也会先转换成int再计算,计算后赋值给byte、short、char须要强制类型转换(我理解由于这时是将一个int变量赋值给byte、short、char,因不知道具体指是多少因此java会认为可能会溢出,因此须要强转)。举例:
byte b1 = 1;
short s1 = 2;
char c1 = 'c';
int sum = b1+ s1 + c1;
System.out.println("sum:" + sum);// sum:102
byte sum2 = sum;//表达式错误,须要强制转型
三、有多种类型的数据混合运算时,系统首先自动的将全部数据转换成容量最大的那一种数据类型,而后再进行计算。
//多种类型混合运算
char cc1 = 'a';
byte bb1 = 1;
short ss1 = 2;
int ii1 = 3;
long ll1 = 4;
float ff1 = 5f;
double dd1 = 6;
double summ3 = cc1 + bb1 + ss1 + ii1 + ll1 + ff1 + dd1;//summ3必须声明为double,不然报错
System.out.println("summ3:" +summ3);// summ3:118.0
四、float f7 = 3L;//正确
解释:由于long类型取值范围容量没有float大
System.out.println(Long.SIZE);
System.out.println(Long.MAX_VALUE);
System.out.println(Float.SIZE);
System.out.println(Float.MAX_VALUE);
输出:
64
9223372036854775807
32
3.4028235E38
显然,long的容量没有float的大
五、类型转换,可能会形成精度下降或溢出。
举例:
精度下降:
举例:
int a = 3;
double b = 0.03;
double c = 0.03;
double d = a+b+c;
System.out.println("d:" + d);//输出:d:3.0599999999999996
解决:使用java.math包中的BigDecima类并用String来构造,不想举例了,手都写痛了,各位看官本身去度娘搜吧。
溢出:
例子1:
int money=1000000000; //10亿
int year=20;
int total=money*year;
System.out.println(total);// 输出结果:-1474836480
错误写法:
int total=money*year//超过int范围
long total=money*year; //由于money和year都是int型,因此他俩的乘积也是int型,超出int型就会出现溢出
long total=(long)(money*year);//道理同上
正确写法:
long total=(long)money*year;//由于long类型乘以int类型仍然是long类型;
例子2:
//一我的70年心跳多少次,输出结果:-2087447296
long times=70*60*24*365*60;
System.out.println(times);
解决:在这条语句long times=70*60*24*365*60;的第一个数字后面加L,这样的话防止前面的相乘结果已溢出如:long times=70L*60*24*365*60;
(全文完)