x + y的数据类型是什么?
double x = 39.21;
float y = 2.1;
说明:
这实际上是一个棘手的问题,因为这段代码无法编译!如 你可能还记得第1章,假定浮点文字 要加倍,除非后缀为f,如2.1f所示。如果值是 正确设置为2.1f,然后促销将类似于最后一次 例如,将两个操作数提升为double,以及结果 将是一个双重值。
但我不明白。如果float y = 2.1;被认为是双倍的 没有必要将变量y推广到double。 我对下一个问题感到困惑,那就是:
x * y / z的数据类型是什么?
短x = 14; float y = 13; double z = 30;
这本书说这将编译甚至浮动y = 13;不是浮动y = 13f。如果它们是小数,我只在浮点数旁边添加f吗?我真的看不出这个问题和上述问题之间的区别。
答案 0 :(得分:3)
忽略char
,Java将提升这样的数字类型:
byte > short > int > long > float > double
这些称为扩展转化。有关详细信息,请参阅JLS §5.1.2. Widening Primitive Conversion。
二元运算符将提升为int
,long
,float
或double
,取其中最接近运算符的两个值,即结果永远不会{ {1}}或byte
。示例:short
会将双方都提升为byte + short
。有关详细信息,请参阅JLS §5.6.2. Binary Numeric Promotion。
赋值运算符还将执行扩展值的转换,并使用类型为int
,byte
的常量表达式的额外规则,如果变量的类型为short
或int
,则byte
将经过narrowing conversion,并且常量表达式的值可在类型中表示。请注意,没有将short
常量缩小为double
的规则。有关详细信息,请参阅JLS §5.2. Assignment Contexts。
所以,对于你的代码:
float
如果已编译代码,double x = 39.21; // double constant to double (identity conversion)
float y = 2.1; // fails because double constant cannot promote to float
的数据类型是什么?
x + y
答案:x + y // double + float promotes to double
下一部分:
double
现在,short x = 14; // narrowing conversion of int constant to short
float y = 13; // widening conversion of int constant to float
double z = 30; // widening conversion of int constant to double
的数据类型是什么?
x * y / z
答案:x * y // short * float promotes to float
(x * y) / z // (float) / double promotes to double
答案 1 :(得分:0)
答案 2 :(得分:0)
如此post中所述,如果您未在数字后面指定字符'f',则该值将被视为双精度。
如上所述,下面的代码段将编译,但前提是字符“f”被添加到浮点值的末尾。
double x = 7.0;
float y = 2.0f;
System.out.print(x + y);