自动类型转换(隐式转换)
byte char short -- int -- long -- float -- double
强制类型转换(显式转换)
(数据类型) 变量或者常量值;
注意问题:
1) 当参与运算的多个数据类型不一致时,参与运算的值会自动转换成范围最大的那个类型然后运算.
2) 而强制类型转换必须保证数据在想转成的数据类型范围内.
3) boolean类型不可以转换成其他类型.
强制类型转换的结果:
以byte为例:
1) 拿到数据后先获取其补码;
2) 然后截取最后8位,得到的是补码;
3) 再通过补码获取其原码, 最后显示给我们的数据是原码的十进制形式.
注意: 计算机中的数据运算都是以补码的形式进行的.
例如:
byte b1 = (byte)140; // -116
分析:
140的原码:
00000000 00000000 00000000 10001100
这是一个正数,所以其补码也是:
00000000 00000000 00000000 10001100
做强制类型转换,截取最后8位,得到的是补码:
10001100
观察到这是一个负数,所以想获取其原码,先得到反码(补码减1):
10001011
最后获取原码(反码的符号位不变,数值位取反):
11110100
这是数的十进制是:
-116
补充: 最小的byte类型数据是 -128 它的二进制表示形式是:1000 0000
关于byte面试题:
byte b1 = 3;
byte b2 = 4;
byte b3 = b1 + b2; // 此行会报错,因为参与运算的byte类型会自动提升为int类型, 可能损失精度.
byte b4 = 3 + 4; // 没问题,对于字面值常量3和4, jvm会在编译期对其进行计算(优化), 并比较其值是否在byte范围内,如果未超出,则不报错.
上述面试题与下面关于字符串的面试题(模样长得差不多),经常被问到:
String s1 = "a";
String s2 = "b";
String s3 = "ab";
System.out.println(s3 == s1 + s2); // false
System.out.println(s3 == "a" + "b"); // true
ASCII 码表概述:
'a' -- 97
'A' -- 65
'0' -- 48 |