一、整型
1、byte,一个字节8位(1位符号,7位数字),取值范围-128(-2^7)到127
2、short,两个字节16位(1位符号,15位数字),取值范围-32,768(-2^15)到32,767
3、int,四个字节32位(1位符号,31位数字),取值范围-2,147,483,648(-2^31)到2,147,483,647
4、long,八个字节64位(1位符号,63位数字),取值范围-9,223,372,036,854,775,808(-2^63)到2^63-1
特别注意:
1、java中整型默认存储为32位的int类型。比如byte本身为8位,在赋值的时候直接将前24位的0删除掉。
2、当long的取值超过int范围,则必须在结尾加L标识,在int取值范围内无需加L。
3、在实际开发中整型尽可能使用int类型,当int会出现溢出时使用long类型。
4、特别注意整型的取值范围,尤其是java变量可能会出现溢出的情况,系统不会有任何提示,但是得到的结果会有差异,示例参考java整型变量数值溢出示例
long long0 = 21;
long long1 = -2147483648;
long long2 = 2147483647;
long long3 = 2147483648L;
二、浮点型
1、float,四个字节32位(1位符号位,8位指数位,23位尾数部分),取值范围整数部分为-2^128(-3.40*e^38)到2^128,精度为2^23*2(16777216),即有效数字为7到8位。
2、double,八个字节64位(1位符号位,11位指数位,52位尾数部分),取值范围整数部分为-2^1024(-1.79*e^308)到2^1024,精度为2^52*2(9007199254740992),即有效数字为16到17位。
特别注意:
1、java中浮点型默认存储为double类型,在实际开发中浮点型尽可能使用double类型。
2、在定义float类型时,需要在结尾加F标识。
float float0 = 2.25F;
3、float和double都无法表示精确的值,会出现丢失精度问题,如下。所以一般涉及到精确的商业计算要使用BigDecimal。
double double1 = 0.30;
double double2 = 0.20;
//0.09999999999999998
System.out.println(double1-double2);
三、字符型
char,两个字节16位,表示一个单一的Unicode字符,可以储存任何字符(包括汉字),运算时直接当对应的ASCII码做整数运算。
char a = 'a';
char b = '王';
char c = 150;
//-
System.out.println(c);
//16进制Unicode码
char d = '\u0045';
//E
System.out.println(d);
四、布尔型
boolean,只用来表示true/false,默认是false。
五、基础类型转换以及相应问题
1、小容量-->大容量,直接转
char g = 152;
byte a= 12;
short b = 15;
int c = 56;
long d = 9666L;
float e = 2.5F;
//float-->double
double m = e;
//long-->float
float k = d;
//int-->long
long v = c;
//char-->int
int n = g;
//byte-->int
int h = a;
2、大容量-->小容量,需要强转
//double-->float
float k = (float) f;
//double-->long
long v = (long)f;
//double-->int
int n = (int) f;
//int-->char
char h = (char)a;
3、强转会导致的问题有:损失精度、数值溢出
浮点型转整型,会直接抹掉小数部分,而不会采取进位方式
double f = 5.999;
//double-->int
int n = (int) f;
//5
System.out.println(n);
如果转之前的数值超出了转之后的取值范围,会出现数值溢出,导致数值出现很大差异
double f = 616.999;
//double-->int
byte n = (byte) f;
//104
System.out.println(n);
4、char和byte、short的互转都需要强转
char g = 152;
byte a= 12;
short b = 15;
char p = (char) b;
char r = (char) a;
byte l = (byte) g;
short v = (short) g;