背景
今天分享初学者的常见问题:
System.out.println(Long.MAX_VALUE > Float.MAX_VALUE);//false |
Java 基本数据类型
在Java语言中,数据类型分为基本类型和对象类型。
其中对象类型继承Object类,按照存储对象的内存模型进行数据存储。对象引用存储在内存栈上,而对象本身的值存储在内存堆上。这个概念上没有什么值得需要注意的地方。
这里,我想说的主要还是 Java 的基本数据类型。
一般来说也就是比较公认的 Java 包括8中基本类型(有的人也说 void 是一种类型),从类型上又可分为:布尔型、字符型和数值型;其中数值型又可分为整数和实数2种。
需要说明的是 boolean
类型所占存储空间的大小没有明确指定,仅定义为能够取字面值true
或false
,它占用的空间取决于Java虚拟机(JVM)的实现,可能是1位也可能是1个字节。
而类型可以自动转化,但需要满足的规则是 byte -> short(char) -> int -> long -> float -> double
逐步提升。
向下就得加强制转换符号。但有可能失去信息。
默认的整数都是int
,默认的小数都是double
。
要定义float
以及long
等类型时得加个后缀,F(小写也可以)或者L,否则编译不会通过。
这也就是编译期间检查编译器会在编译期对 byte、short、int、long、float、double、char
型变量的值进行检查,如果超出了它们的取值范围就会报错。
byte bb = 1455;//编译过不了 eclipse 会提示: Type mismatch: cannot convert from int to byte |
并且当使用 +、-、*、/、%` 运算符对基本类型进行运算时,遵循如下规则:
- 只要两个操作数中有一个是double类型的,另一个将会被转换成double类型,并且结果也是double类型;
- 否则,只要两个操作数中有一个是float类型的,另一个将会被转换成float类型,并且结果也是float类型;
- 否则,只要两个操作数中有一个是long类型的,另一个将会被转换成long类型,并且结果也是long类型;
- 否则,两个操作数(包括byte、short、int、char)都将会被转换成int类型,并且结果也是int类型。
当使用 +=、-=、*=、/=、%=
运算符对基本类型进行运算时,遵循如下规则:
运算符右边的数值将首先被强制转换成与运算符左边数值相同的类型,然后再执行运算,且运算结果与运算符左边数值类型相同。
这也是经常在某些面试题上出现的问题。
初学者常见问题
还需要说明的是从 JDK 1.5 开始,Java基本数据类型及其对应包装类之间能实现自动装箱解箱操作。
就是说 int
自动装箱成Integer
等。
另外,有的人可能会问,自动转型的时候,为什么占用8个字节的long
还能转成4个字节的float
呢?
或者到底是Float
的 MAX_VALUE 大还是Long
的 MAX_VALUE 大呢?下面这段代码可以看出结果。
System.out.println(Long.MAX_VALUE > Float.MAX_VALUE);//false |
居然是false。
什么原因呢?
再看下面的。
float f1 = 10000000143242F; |
应该能看出原因了吧?结果就是进度不一致。
float使用ieee754格式存储。只有24位精度,两个float之间的距离可能很大。
举个简单的例子,10000000143242和10000000000000用float表示的话这两个数是相同的 。但是整数是精确表示的。
这就是float为什么比long的范围广的原因了。
下面把测试代码贴出来
char c = 'A'; |