赞
踩
一 Java 语言基本数值计算
我们知道, Java语言定义了六种基本的数值类型 (四个整型,两个浮点型):byte, short, int, long,
float, double。 (java 语言共8中数值类型,另两种是char, boolean,
前者表示字符类型,后者表示布尔类型)
int i = 3; 中 常量 3 的数值类型是 int。
long l = 3; 中 3 依然是 int 类型,
但编译器在运行时根据左边的类型要求,把它转化成 long 。因为 long (64位) 比 int
(32位)数值范围大,所以这种隐式转化可以的。但反过来必须用显示转换:
long l = 3;
int i = l; // 编译错误 ,必须用 int i = (int)
l; 因为这样强制转换可能会丧失精度。
比较下面两个结果有什么不同:
public class JavaLang {
public static void main(String[]args) {
long l1 =
Integer.MAX_VALUE + 1;
System.out.println(l1);
long l2 =
Integer.MAX_VALUE + 1L;
System.out.println(l2);
}
}
没错 ,结果一个正,一个负:
-2147483648
2147483648
原因是, long
l1 = Integer.MAX_VALUE + 1; 首先按照 int 计算右边的算式, 因为超过 int
最大值,出现溢出, 从正最大(2147483647)变为负最大。 (印证了物极必反,乐极生悲)。而
long l1 = Integer.MAX_VALUE + 1L; 中, 因为 1L 声明为
long 类型,所以右边先以 long 型进行运算,没溢出发生。
所以,Java 语言基本数据类型预算时采取的策略是,
采用 int 作为缺省的运算类型, 条件是,参与运算的所有操作数类型是 int, byte, short。
当操作数中有 long 类型,则采用 long类型作为运算,即先把运算的各项转换成long, 然后再运算。
为什么下面两个声明一个没问题,一个有编译错误:
long l =
3; // 没问题, 因为 3 类型是 int ,而 int 向 long 隐性转换。
float f = 3.0; //
有编译错误, 因为 3.0 类型是 double,double
向float转换,由于是范围缩小,所以,必须用显示的转换: float f = 3.0F
为什么下面这个没有编译错误:
byte b = 100;
short s = 100;
因为 java 语言自动把 常量 100 当成 byte
和 short类型。
为什么下面却有编译错:
byte b1 = 100;
byte b2 = 100;
byte b3 = b1 + b2; // 有编译错, 因为 右边 加法是用 int 进行的,和是 int 型, 转化成
byte 需显示转换, 正确的方式是 byte b3 = (byte) (b2-b1) ;
为什么会这样呢? 没啥为什么,Java 语言就是这么规定的, 兼顾了语言的严谨和效率。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。