java中8中基本数据类型,每种数据类型都有不同容量。当大容量数据类型向小容量数据类型进行强制类型转换时可能出现数据溢出。首先先总结一下,java中基本数据类型所在内存大小和能表示的数据范围。
基本类型
位数
范围
默认值
byte(字节)
8
-128 至 127
0
shot(短整型)
16
-32768 至 32767
0
int(整型)
32
-2147483648至2147483647
0
long(长整型)
64
-2^63至2^63-1
0L或0l
boolean
1
0,1或true,false
false
char
8
\u0000至\uffff
\u0000
flaot
double
每种基本数据类型在java中都有相应的包装类,其中记录相对应基本数据类型的最大值和最小值,并提供了一些方便数据类型转换的接口。
当数据类型进行强制类型转换时,超出了数据表示范围就会出现数据溢出。比如:
int i = 703;
byte b = (byte)i;
System.out.println(b);
打印结果为-65 。之前没有研究过,自以为猜测打印结果应该是127.
正确的解析过程应该是,222二进制表示应该是1010111111(由于i是int32位,所以前面应该很多个0凑集32位),但是byte只有8位容量,最终b=10111111(最左边的两位10被截取了)。 10111111直接转换成十进制是191,并不是-65 .那这个65 又是怎么得到的呢?
计算机的最高为是符号位,0表示正数,1表示负数。当为负数时,转换成十进制需要遵循这样一个规则。
1、首先按位取反,最高位符号位不需要转,10111111->11000000
2、再加1. 为11000001
3、最高位1表示-,1000001转换为十进制为65.所以最终结果为-65
所以当int类型向short、byte类型强制类型转换时出现一些莫名其妙的值时,都可以运用以上的规则进行解析。