Java程序中的单行多类型转换

Java程序中的单行多类型转换,java,casting,type-conversion,Java,Casting,Type Conversion,今天,我在处理Java语法时,试图编译以下一段Java代码: class Mess { public static void main(String[] args) { float i = (char)(int)(long)(byte) 100; System.out.println(i); } } 代码实际上没有给出编译或运行时错误。将i的数据类型更改为任何其他数据类型,如int或double或char,同样有效。不仅如此,在声明中引入操作也没

今天,我在处理Java语法时,试图编译以下一段Java代码:

class Mess {
    public static void main(String[] args) {
        float i = (char)(int)(long)(byte) 100;
        System.out.println(i);
    }
}
代码实际上没有给出编译或运行时错误。将
i
的数据类型更改为任何其他数据类型,如
int
double
char
,同样有效。不仅如此,在声明中引入操作也没有任何错误:

float i = (char)+(int)-(long)(byte) 100;
当我在Netbeans中使用auto format格式化代码时,上面的声明格式如下:

float i = (char) +(int) -(long) (byte) 100;

请帮助我理解这段代码是如何编译的?

它基本上只是一系列类型转换和一元
+
-

float i = (char) +(int) -(long) (byte) 100;
相当于

byte tmp1 = (byte) 100;
long tmp2 = (long) tmp1;
long tmp3 = -tmp2;
int  tmp4 = (int) tmp3;
int  tmp5 = +tmp4;
char tmp6 = tmp5;
float i = tmp6;
最后一个赋值是从
char
float
,这是一个扩展的原语转换。看

19基元类型的特定转换称为扩展基元转换:

  • 字节到短、int、long、float或double
  • 短到整数、长到浮点或双精度
  • char到int、long、float或double
  • int到long、float或double
  • 长到漂浮或翻倍
  • 浮动至双倍
你可以这样想:

   float i = ((char) +((int) -((long) ((byte) 100))));
每一步都会将结果转换为自己的类型。因此,令人惊讶的是,100变成了65436.0
由于所有这些中间类型转换。

加号和减号在此上下文中也是一元运算符,为什么您认为不允许多次转换?为什么我要多次转换相同的值(或变量)?我想不出有必要这样做的情况。@Bhoot,id您有两个整数,想要执行除法,您可能需要执行
int result=(int)((double)I/j*100)-100
转换为
char
char
的范围是
0
-
65536
。这不是一个很正确的例子,因为涉及到“-”符号。