Java程序中的单行多类型转换
今天,我在处理Java语法时,试图编译以下一段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,同样有效。不仅如此,在声明中引入操作也没
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)例如,@aioobe:这对我来说是一个很好的叫醒电话。虽然我可以自如地使用所有数据结构和其他“复杂”的java UTIL,但这些基本原理却不太清楚。这是由于从-100
转换为char
。char
的范围是0
-65536
。这不是一个很正确的例子,因为涉及到“-”符号。