数值类型之间的转换与赋值

数值类型之间的转换

6个实现箭头,表示无信息丢失的转换;另外三个箭头,表示可能有精度的损失。例如,123456789是一个大整数,它所包含的位数比float所能表示的位数多。当将这个整数转换为float类型时,将会得到正确的大小,但是会损失一些精度。

public class IntSty {
    public static void main (String [] args) {
        int n = 123456789;
        float m = (float) n;

        System.out.println(m); // 1.23456792E8
    }
} 

当用一个二元运算符连接两个值时(例如n+f,n是整数,f是浮点数),先将这两个操作数转换为同一种类型,然后进行计算。

  • 如果两个操作数中有一个是double,另一个操作数就会转换为double类型。
  • 否则,如果其中有一个float类型,另一个操作数将会转换为float类型。
  • 否则,如果其中有一个为long类型,另一个操作数将会转换为long类型
  • 否则,两个操作数都将转换为int类型

所以,java有一些奇怪现象,如short类型与byte类型进行算术运算会得到一个int类型。多个char类型之间进行算术运算将会获得一个int类型值。

public class IntSty {
    public static void main (String [] args) {
        byte b = 1;
        short s = 100;
        int i = b * s;

        char c1 = 'a';
        char c2 = 'b';
        char c3 = 'c';

        System.out.println(i); // 100
        System.out.println(c1 + c2 + c3); //294
    }
} 

不同类型之间的赋值

如果类型A转换为另一个类型B不会发送精度损失,那么B=A的赋值操作是可以的,反正则编译不会通过。

short s = 10;
int i = 100;
float f = 3.14f;
double d = 171.5;

//short n1 = i;  // error
int n2 = s;  // ok
//int n3 = f;  // error
float n4 = i;  // ok
//int n5 = d;  // error
double n6 = i;  //ok
double n7 = f;  // ok