1、Java基本数据类型及其表示范围
数据类型 | 占用存储空间 | 表示范围 |
---|---|---|
byte | 1字节 | −27~(27−1) 即-128~127 |
short | 2字节 | −215~(215−1) 即-32768~32767 |
int | 4字节 | −231~(231−1) 约正负21亿 |
long | 8字节 | −263~(263−1) 大约可以表示人类上下五千年的米的数量 |
float | 4字节 | (−3.403∗1038)~(3.403∗1038) 比long要大 |
double | 8字节 | (−1.798∗10308)~(1.798∗10308) |
float | 4字节 | (−3.403∗1038)~(3.403∗1038) 比long要大 |
char | 2字节 | 0~65535 内部采用Unicode编码 |
boolean | 1位 | true 或者 false |
BigInteger | 可以表示大于long类型的整数 | |
BigDecimal | 可以表示精确的浮点数,避免浮点数的误差问题 |
2、自动类型转换
a、容量小的可以自动转化为容量大的类型
b、特例:整数类型可以直接赋值给byte、short、char等类型常量,而不需要强制类型转化,只要不超过他们的范围
*注意:
1、注意图中红色的部分虽然能够自动转型但是会有精度丢失
测试截图:
3、强制类型转化
除了上图中会发生自动转化的类型外,其他的都需要强制类型转化,
例如
int b = (int) 1000L;
由于long类型是8个字节,int 为 4个字节,从int转化为long可能会损失精度,所以需要强制类型转化
*注意:
强制类型转化乱码问题
如果强转转化之后的数值超过了目标类型,例如下面这个程序70000已经超过char类型的表示范围,这是运行时虽然不会报错,但是输出结果会没有意义,因为它已经超出了指定的内存范围,因此它超出后便会指向一块没有意义的内存地址
@org.junit.Test
public void test2() {
char c = (char) 70000;
System.out.println(c);
}
程序执行结果:
4、运算时类型提升问题
我们通过几个例子来说明类型提升问题
@Test
public void test02() {
int a = 100;
long b = 200;
int c = (int) (a+b);
System.out.println(c);
}
由于a是int类型,b 是 long类型,a+b的结果就会被提升较高的类型long,所以要进行int c = (int)(a+b)
的强制类型转化
类型提升问题容易犯的错误
我们还是通过程序来举一个例子:
*注意:
1、上图中的1_000是java7的新特性等同于1000是为了便于观看用的
2、由于Eclipse默认的整数类型是int类型,在前三个数相乘的时候都是int类型之间的乘法,在乘以第四个long类型之前,即在发生类型提升之前就已经超出了int类型的范围,所以输出结果结果就会是一个没有意义的负值,解决方法就是将L放在最前一个数,保证一开始就进行了类型提升