在Java中使用short,int,long,double,float进行转换

时间:2012-05-09 13:13:14

标签: java types casting int double

据我所知,当您使用Java中的算术运算在这些类型中的两个之间进行转换时,例如double + int,结果将是更大的类型(在本示例中,结果将是double)。在对相同大小的2种类型进行算术运算时会发生什么? int + float和long + double会给出什么?因为int和float每个都是4个字节,而long和double是8个字节。

6 个答案:

答案 0 :(得分:10)

这全部由JLS中的二进制数字促销规则指定。来自http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2

  

当运算符将二进制数字提升应用于一对时   操作数,每个操作数必须表示可转换为a的值   数字类型,以下规则适用:

     
      
  1. 如果任何操作数属于引用类型,则将其取消装箱   转换(第5.1.8节)。

  2.   
  3. 应用扩展基元转换(第5.1.2节)来转换或   两个操作数由以下规则指定:

         
        
    • 如果任一操作数的类型为double,则另一个操作数转换为double。

    •   
    • 否则,如果任一操作数的类型为float,则转换另一个操作数   漂浮。

    •   
    • 否则,如果任一操作数的类型为long,则转换另一个操作数   很久。

    •   
    • 否则,两个操作数都将转换为int类型。

    •   
  4.         

    在类型转换后,如果有的话,值集转换(§5.1.13)是   应用于每个操作数。

         

    对某些运算符的操作数执行二进制数字提升:

         
        
    • 乘法运算符*,/和%(§15.17)

    •   
    • 数值类型+和 - 的加法和减法运算符   (§15.18.2)

    •   
    • 数字比较运算符<,< =,>和> =(§15.20.1)

    •   
    • 数字相等运算符==和!=(§15.21.1)

    •   
    • 整数位运算符&,^和| (§15.22.1)

    •   
    • 在某些情况下,条件运算符? :(§15.25)

    •   

(“值集转换”是关于浮点表示之间的映射。)

答案 1 :(得分:2)

int + float将为您提供float(请注意,您必须将结果投放到float,因为默认使用doublelong + double将为您提供double

答案 2 :(得分:0)

仍然会返回可以保存完整值的"bigger"类型。在您的具体问题

如果你在int和float之间做一个+,那么return将是一个float    和long + double返回一个double,

答案 3 :(得分:0)

添加运算符+-的行为由JLS的15.18.2. Additive Operators (+ and -) for Numeric Types定义。它声明它首先执行二进制数字促销:

  

对操作数执行二进制数字提升。

这反过来由5.6.2. Binary Numeric Promotion定义。实质上,对于原始人:

  • 如果任一操作数的类型为double,则另一个操作数将转换为double。
  • 否则,如果任一操作数的类型为float,则另一个操作数转换为float。
  • 否则,如果任一操作数的类型为long,则另一个操作数将转换为long。
  • 否则,两个操作数都将转换为int。

答案 4 :(得分:0)

有两个关于类型转换的有趣常见问题解答,可在以下网址找到:http://www.programmersheaven.com/2/FAQ-JAVA-Type-Conversion-Casting

http://myhowto.org/java/60-understanding-the-primitive-numeric-type-conversions-in-java/

在两种相同尺寸的类型上回答您的问题,返回值是具有最高精度的类型。

请尝试以下代码:

public static void main(String[] args) {
    int i=1;
    float f=2.5f;
    long l=10;
    double d=3.74;
    System.out.println(i+f);
    System.out.println(f+i);
    System.out.println(l+d);
    System.out.println(d+l);
}

你会看到结果是3.5和13.74,分别是浮点数和双精度数(在Netbeans 6.9和java 1.6中测试过)。

答案 5 :(得分:0)

这个“促销”的一个问题是,long + float会“扩大”使用浮动。

e.g。

System.out.println(1111111111111111111L + 0.0f);
System.out.println(1111111111111111111L + 0.0);

打印

1.11111113E18
1.11111111111111117E18

当处理long和float时,你可能得不到更广泛的类型,并且可能失去比你预期的更高的精确度。