Java 数据类型

2020-04-25   97 次阅读


数据类型转换规则

  1. 八种数据类型当中,除布尔类型之外剩下的七种数据类型可以互相转换。
  2. 小容量向大容量转换,称之为自动类型转换。容量从小到大排序:
    • byte < short < int < long < float < double < char
  3. 大容量转换成小容量,叫做强制类型转换,需要加强制类型转换符👉(int)👈,程序才能编译通过,但是有可能会损失精度
  4. 当整数字面值没有超出byte short char的取值范围,可以直接赋值给byte short char类型的变量。
  5. byte short char混合运算时,各自先转成int类型再做运算。
  6. 多种数据类型混合运算时,先转换成容量最大的类型再做运算。

关于Java编译问题

注意: 可以编译通过, 3 没有超出byte类型取值范围

byte b = 3;

编译错误,因为编译器只检查语法,不会"运算" i / 3,只有涉及到JVM才会运算,编译期不执行

int i= 10;
byte b = i / 3;

注意: 任何浮点类型不管占用多少字节,都比整数型容量大。charshort可表示种类数量相同, 但是char可以取更大的正整数。

javac检查语法与编译,并不会执行代码,只有经过JVM才可能执行

float转short损失精度

float转为short时,编译成功但损失精度,最终结果为20

  public static void main(String[] args){
    float a = 20.12f;
    short s = (short)a;
    out.println(s);
  }

类型转换

在Java中从左到右先算小括号,以下代码编译报错是因为第五条规则byte short char混合运算时,各自先转成int类型再做运算,而下面先给s转为byte,但是运算时依然会将s转回int,所以语法错误

short s = 10;
byte b = 3;
byte i = (byte)s + b;

编译错误

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
        Type mismatch: cannot convert from int to byte

        at DataType.main(DataType.java:8)

而若是将sb先运算得出结果,再转为byte编译就不会报错,语法通过

    short s = 10;
    byte b = 3;
    byte i = (byte)(s + b);
    out.println(i);

编译器(javac)只检查语法与编译,并无任何代码执行

自动类型转换

10 / 3正确结果等于3.333333...,但以下输出结果是3.0,这是因为d变量的字面值是整数运算完成后的结果,而计算时103都是int类型,上面第六条提到: 多种数据类型混合运算时,先转换成容量最大的类型再做运算,所以最终结果计算为3并赋值给d

  public static void main(String[] args){
    double d = 10 / 3;
    out.println(d);
  }

而当103都为double类型时,结果为3.3333333333333335

  public static void main(String[] args){
    double a = 10.0d;
    double b = 3.0d;
    double d = a / b;
    out.println(d);
  }

到此可以得出一个结论,当字面值运算时,它的结果不一定与等号左侧数据类型相等,而我们看到的数据,是它们转换后的结果

总结

  1. Boolean外,其它七种基本数据类型可以互相转换
  2. 小容量转大容量叫做自动类型转换
  3. charshort平级
  4. 大容量 转换成小容量叫做强制类型转换,强制类型转换需要加强制类型转换符(...)(int),编译通过但是程序运行期可能会导致精度损失

所有学习资料均来自互联网,本人各种摘抄实验的结果

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

2002年4月出生于广东省 2017年学习编程至今