Java是什么类型的(长a - 双b)

时间:2013-05-28 09:01:06

标签: java

正如标题中所述: 在从长值中减去double值时,内部会发生什么?类型为double或long的结果是否甚至在Java规范中指定了这种行为,或者这种行为是否特定于jvm?

所以我知道我可以测试自己jvm的作用:

    public class Test {

        /**
         * @param args
         */
        public static void main(String[] args) {
        double b = 1000;
        long a = 1000;
        Object c = a - b;
        Class cls = c.getClass();  
        System.out.println("The type of the object is: " + cls.getName());
        }

    }

输出:

    The type of the object is: java.lang.Double

但这是在某处指定的吗?或者它是否特定于我使用的jvm?

5 个答案:

答案 0 :(得分:6)

以下是规范的适用部分:

<强> 4.2.4。浮点运算

  

如果数值运算符的至少一个操作数是类型的   double,然后使用64位浮点执行操作   算术,并且数值运算符的结果是值   双打。如果另一个操作数不是double,则首先加宽   (§5.1.5)通过数字提升键入double(§5.6)。

http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.4

答案 1 :(得分:4)

  1. 由于a很长而bdouble a - b会产生doubleFloating-Point Operations)。

      

    如果数值运算符的至少一个操作数是double类型,则使用64位浮点运算执行运算,并且数值运算符的结果是double类型的值。如果另一个操作数不是double,则首先将其扩展(第5.1.5节)以通过数字提升键入double(第5.6节)。

  2. 然后double结果会自动设置为DoubleBoxing Conversion)。

答案 2 :(得分:1)

这里有几件事情要发生。 a-b操作产生一个双 - 这是原语的扩展,以适应信息的丢失。

http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1

然后,您将结果分配给Object引用(Object c = a - b;),它会生成double对象的自动装箱。

http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html

答案 3 :(得分:0)

我会说,如果公式中有一个double,如果没有强制转换,结果必然是double(或至少是一个浮点数)。

与(10/3)相同的是int而(10.0 / 3)不会。

答案 4 :(得分:0)

实际上,输出类型将始终是opperation左变量的类型。您的编译器将尝试转换或转换您正确的参数。如果可能,它将编译,否则你将有编译错误。