众所周知,Java中有八个基本数据类型。分别是 boolean char byte short int long float double,所占的字节数和范围如下:
java基本数据类型
Type
Class
Bits
Bytes
Mix
Max
Range
boolean
Boolean
2
false
true
(0,1)
char
Character
16
2
0
2^16 -1
0 ~ 65535
byte
Byte
8
1
-2^7
2^7 - 1
-128 ~ 127
short
Short
16
2
-2^15
2^15 - 1
-32768~32767
int
Integer
32
4
-2^31
2^31-1
-2147483648~2147483647
long
Long
64
8
-2^63
2^63 - 1
-9223372036854775808~
9223372036854775807
float
Float
32
4
1.4E-45
3.4028235E38
略
double
Double
64
8
4.9E-324
1.7976931348623157E308
略
其中,当我们进行赋值时
若是整数则默认为int类型
例如: char a = 127;
这个数127在赋值前默认为int类型,然后隐式转换为char类型
若是浮点数则默认为double
例如: float f = 1.0;
这个数1.0在进行赋值操作前是double,然后隐式转换为float类型
今天遇到了两个由问题
问题一: 运行以下代码
package com.test
public class Test{
public static void main(String[] args){
long micros_per_day = 24 * 60 * 60 * 1000 * 1000;
long millis_per_day = 24 * 60 * 60 * 1000;
System.out.println(micros_per_day / millis_per_day); // 得出结果为5
}
}
得出的结果为5 ,??? 什么情况,是我数学不好吗???不应该是1000吗???
查遍资料终于得到了结论
整数在赋值时默认为int
long micros_per_day = 24 * 60 * 60 * 1000 * 1000;
这条语句在执行时先将这个数算出,然后默认转换为int类型,再将int类型转换为long类型,执行了3步
在赋值时,因为这个数大于int的最大值,所以结果溢出,得到的不是86400000,而是500654080
如何解决?
赋值时将int强制转换为long
即将上述语句转换为
long micros_per_day = (long) 24 * 60 * 60 * 1000 * 1000;
这样得出的结果为1000
这里涉及的知识点有
1. 整数在赋值时默认类型为int
2. 隐式类型转换:精度低的转换为精度高的
问题二:
输出下列语句的结果:
System.out.println("(int)(char)(byte)-1");
输出结果: 65535
这是一道面试题,考的是对基本类型的掌握。这道题解题题眼在char的范围是0~65535
结论是:
/*
* (int)(char)(byte)-1
* 执行步骤:
* 1. 开始-1为int类型,原因是所有的整数类型默认为int型
* 2. -1 由int类型转换为byte类型的-1
* 3. byte类型的-1转换为char类型,由ascii表可得到-1不在表示范围,
* 因为char默认占两个字节,即16bit,所能表示的范围为0 - 65535
* 把-1转换为char,然后从后面开始找,得到65535
* 4. char类型的65535转换为int类型的65535
*/