java默认类型
**说在前:**在java中,整数 默认是 int 类型,小数 默认是 double 类型。
数值型 表示范围:byte(1字节)< short(2字节) < int(4字节) < long(8字节)
浮点型 表示范围:float(4字节) < double(8字节)
字符型 表示范围:char(2字节)
boolean型 表示范围:boolean(1字节)
byte类型变量赋值解惑
public static void test1(){
byte b1 = 128; // ①error
byte b2 = 5,b3 = 6; // ②ok
byte b4 = b2 + b3; // ③error
int b5 = b2 + b3; // ④ ok
byte b6 = 2; // ⑤ok
b6 += 5; // ⑥ok
b6 = b6 + 5; // ⑦error
byte b7 = (byte)128; // ⑧ok
System.out.println(b7); // ⑨-128
}
解惑:
①为什么error?
因为byte类型表示范围[-128,127],128超过了byte范围的最大值。
②无惑
③为什么error?
解释1:java中整数的默认类型是int型,b2+b3值为11是int类型,但是b4是byte类型。这是精度问题。 该解释不够透彻,需要结合解释2来说。
解释2:你可能会问b=5+6为什么正确?5+6也是11呀!!! 这要涉及编译阶段的检查了,编译阶段只能知道b2、b3的类型,无法知道具体值(虽然编译器在检查b2=5时可以查出5可以复制给b2),因为内存分配是在运行时,同时两个byte类型变量求和可能超过byte的范围,存在数据溢出的可能,因此报错,提示要进行强制类型转换。
④上边③error了,④怎么ok呀?
因为b5是int类型呀,编译阶段虽然b2+b3的值不确定,但是两个byte类型相加,怎么也不会超过int的表示范围呀,所以ok啦!!!
⑤无惑
⑥什么?b5+=5与b5=b5+5还不同?
由③可知,b5=b5+5报错理解了,但是b5+=5不也应该报错吗?但是代码实验ok呀!!
这是因为,存在一个强制类型转换的问题,就像C++的运算符重载,编译器自动将+=运算符后面的操作数强制装换为前面变量的类型,然后在变量所在的内存区上直接根据右边的操作数修改左边变量内存存储的二进制数值。
⑦这个也容易理解,byte表示范围[-128,127],虽然128超过byte表示范围了,但是人家也强制转换了。数值结果如下:
"C:\Program Files\Java\jdk1.8.0_131\bin\java.exe" "-javaagent:C:\Program ……" recursive
-128
Process finished with exit code 0
为什么是-128,见https://blog.csdn.net/ljb825802164/article/details/89787574
long型 int型赋值问题
int类型最大值如下:
public static void test2(){
System.out.println(Integer.MAX_VALUE);
}
test2输出
"C:\Program Files\Java\jdk1.8.0_131\bin\java.exe" "-javaagent:C:\Program ^
2147483647
Process finished with exit code 0
一般情况,给变量赋值时就是把数值传递过去,如下给long型变量L4赋值
public static void test3(){
long L4 = 2147483648;
}
test3输出结果
Information:java: Errors occurred while compiling module 'Test'
……
Error:(76, 19) java: 过大的整数: 2147483648
咦!什么鬼,由test1我们知道Integer.MAX_VALUE = 2147483647,这里L4赋值2147483648提示error,难道long型变量L4表示的数据类型范围还比int小??
这是因为java中整数默认是int类型,2147483648 > Integer.MAX_VALUE了,因此提示error。
那该如何给long型变量赋予一个大于Integer.MAX_VALUE 的值呢?如下test4所示
public static void test4(){
long L4 = 2147483648L;
System.out.println(L4);
}
test4输出
"C:\Program Files\Java\jdk1.8.0_131\bin\java.exe" "-javaagent:C:\Program …… recursive
2147483648
你看,此时正常输出了。就是在数值后面加了“L”来表示是long型(数值型默认是int型哟)