java中数据类型
整数默认:int
小数默认:double
基本数据类型取值范围
整型
byte Byte [-2^7~2^7-1] 1个字节 8位35B
short Short [-2^15~2^15-1] 2<span style="font-family: Arial, Helvetica, sans-serif;">个字节 16位35S
int Integer [-2^31~2^31-1] 4个字节 32位35
long Long [-2^63~2^63-1] 8个字节 64位35L
浮点型
float Float [1.401298e-45~3.402823e+38] 4个字节
double Double [4.9000000e-324~1.797693e+308] 8个字节
char占两个字节,boolean占一位:
默认转换
byte,short,char——>int——>long——>float——>double; byte,short,char相互之间不转换,他们参与运算首先转换为int类型 ;
强制转换 :把大的类型转换成小的类型
目标类型 变量名=(目标类型)(被转换的数据);
相关题目
1、下面的语句是否有问题?
byte b1 = 3, b2 = 4;
byte b3 = b1 + b2; //语句1
int b4 = b1+b2; //语句2
byte b5 = 3+4; //语句3
解答:语句1会报错,因为b1和b2作为变量参与运算的时候,会先提升为int类型,然后将int类型的结果赋值给byte,可能会丢失精度,所以报错;
语句2没有问题,因为是把int结果给int,类型匹配;
语句3正确,因为3和4是常量,所以编译器编译的时候,会计算出结果,然后判断结果是否在byte的范围内,在的话就不会报错,如果咱们反编译class文件,会发现这一句变成了byte b5=7;
结论:变量参与运算会先做类型提升,而常量会直接计算后判断类型是否匹配;
2、下面这两个表示有没有问题,有什么区别?
解答:
float f1 = (float)12.345;
float f2 = 12.345F;
都没有问题,第一种相当于先定义了一个double类型常量,然后截取了后四个字节得到了f1,第二种是直接定义float,建议定义第二种。
3、byte b = 130 有没有问题?
解答:有,因为超出了范围;
如果如下修改:
byte b = (byte)130;
System.out.println(b);
结果为:-126,
分析:
A: 把130转换成二进制为:10000010,因为是int类型4个字节,所以结果因为是:
00000000 00000000 00000000 10000010 这个是130的原码,也是反码,也是补码;
B: 截取成byte类型的,结果为: 10000010,这个是结果的补码,我们需要转换成原码:
符号位 数值为
补码: 1 0000010
反码: 1 0000001 补码上减1
原码: 1 1111110 把反码各位反过来
接下来把11111110转换成10进制,结果为-126;
4、为什么long会自动转换成float?
解答:float虽然是4个字节,long是8个字节,但是底层存储方式不同,所以float能表示的范围比long大
5、JAVA中char能够表示一个汉字?
解答:能,因为JAVA中char是两个字节;