1、各数据类型的最大值和最小值java
整数:ide
以byte为例,咱们知道,byte共有8个bit位,最大值是0111111,最小值是10000000,用十进制来表示就是-128~127,即-2^7~2^7。spa
依照上面的推理方式可知it
总结下表:table
数据类型 |
bit位 | 取值范围 |
byte | 8 | -2^7~2^7-1 |
short | 16 | -2^15~2^15-1 |
int | 32 | -2^32~2^32-1 |
long | 64 | -2^63~2^63-1 |
小数:class
咱们知道float是32位,double为64位,分别被叫作单精度和双精度小数。可是他们的最大值却不是经过上面的代码来肯定的,咱们用代码来看看它们的最大值是多少:数据类型
System.out.println("float的最大值:"+Float.MAX_VALUE); System.out.println("double的最大值:"+Double.MAX_VALUE);
运行结果:
二进制
float的最大值:3.4028235E38 double的最大值:1.7976931348623157E308
经过上面的代码,咱们知道了float的最大值为3.4*10^38,double的最大值为1.79*10^308。float
那为何一样是32位的int和64位的long没法表示呢?方法
咱们来看看存储结构:
因为二进制比较麻烦,咱们用十进制来表示。
整数的存储很简单,第一位为符号位,其余剩余位都表示数值,例如
0 | 9 | 9 | 9 |
第一位为符号位,后面的三位则均为数字位,因此,这表示的就是999。
可是小数的存储方法就不相同:
符号位 | 指数位(阶码位) | 尾数位(小数位) |
以double第一位和整数同样是符号位,以后的指数位共有11位,剩下的位数所有是尾数位,以double为例,double的尾数位就是52位。
仍是刚才的数值:
0 | 9 | 9 | 9 |
这就是为何一样位数的小数要比整数表示的数字要大。
2、精确度
咱们首先用int 和float表示相同的一个数字:
int a = 12345678; float b = 12345678; System.out.println("int:"+a); System.out.println("float:"+b);
运行结果:
int:12345678 float:1.2345678E7
此时,int和float的值结果是相同的,当他们表示一个更大的数时就会出现以下问题:
int a = 123456789; float b = 123456789; System.out.println("int:"+a); System.out.println("float:"+b);
运行结果:
int:123456789 float:1.23456792E8
此时,float丢失了一个数字8,如今咱们再用double来表示这个数字:
double c = 123456789; System.out.println("double:"+c);
运行结果:
double:1.23456789E8
咱们惊奇的发现:double没有丢失数据!
正如咱们上面说的,float是32位,double为64位,float之因此出现丢失数据的显现,是由于float的位数不足以存储123456789,因此部分数据就丢失了,可是double有64位,小数位足以表示123456789,所以就不会发生数据丢失。
3、强制数据类型转换
高精度->低精度
从高精度转为低精度时会发生精度丢失的情况,例如:
double a = 123.45; int b = (int) a; System.out.println(b);
运行结果:
123
可见,由double转为int时,会将小数部分丢掉。
高位->低位
位数多的转为位数少的会发生高位数据丢失,例如:
int a = 129; byte b = (byte) a; System.out.println(b);
运行结果:
-127
咱们知道,int为32位,129用二进制表示就是00000000 00000000 00000000 10000001。在强转为byte时,因为byte只有8位,会将前24位所有舍掉,剩下的就是10000001,转为十进制就是-127。