java基本数据类型之初始化可能遇到小坑

Java的基本数据类型其实我们并不陌生,从存储的所占内存从小到大依次是 : byte(字节型)【8bit】, short(短整型)【16bit】, int(整型)【32bit】, long(长整型)【64bit】, float(单精度浮点型)【32bit】, double(双精度浮点型) 【64bit】。

在开发的过程中很多时候定义一个变量不会直接自己初始化赋值的,而是直接将某个方法产生过程的结果直接赋值过来。但是实际上很多小细节小坑确实存在,虽然实际开发很难遇到,但是我们也不得不掌握。

常量在存储在jvm 开辟的内存中常量区部分的,而我们声明的变量是存在栈内存中的,对于给一个基本数据变量赋初值得时候,其实jvm执行的操作是将存储在常量区的值copy 一份存在变量中的。

1,对于整数:

eg1: int a = 1; jvm的内部的操作如下图大致所示:
java基本数据类型之初始化可能遇到小坑
eg2:byte a = 1; //赋值成功

eg3:byte a = 128; //报错
原因: 由于在常量区的整数,JVM默认将他视为一个int类型(32位)的数,而byte类型位8位,对于eg1来说,1在内存中的存储形式为32位二进制(0 0000000 00000000 00000000 00000001), 在给byte赋值时JVM可以判断前面的除了后8位多出部分是否有意义,无意义则直接截取后8位。所以并没有报错。
而对于eg3来说,由于byte类型的范围位 -128(2的7次方) ~ 127(2的7次方-1) 显然超出了byte的存储最大位数,所以无法自动截取而报错。

eg4: long b = 2147483648; //报错
原因: 正确的写法应该是在数字后面加 l或者L。( long b = 2147483648L;)
由于默认整数类型JVM认为是int类型,范围为 -2147483648(2的32次方) ~ 2147483647(2的32次方-1),超过这个范围如果不加l或L声明long类型的话,jvm视为你写错或者其他原因,所以报错。所以需要告诉虚拟机自己并没有写错确实是需要long类型。

2,对于小数:

eg5:float c = 1.5; //报错
原因: 正确的写法应该是在数字后面加 f或者F。( float b = 1.5F;)由于小数在常量池中默认认为是double类型的。当他直接赋给float类型时就会报错提示精度可能会丢失。