众所周知,Java中有八个基本数据类型。分别是 boolean char byte short int long float double,所占的字节数和范围如下:
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
*/