0

据我了解,当您使用 Java 中的算术运算(例如 double + int)在其中两种类型之间进行转换时,结果将是更大的类型(在此示例中,结果将为双精度)。当你对两种大小相同的类型进行算术运算时会发生什么?int + float 和 long + double 会给出什么?因为 int 和 float 分别是 4 个字节,而 long 和 double 是 8 个字节。

4

6 回答 6

10

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

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

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

  2. 加宽原语转换(第 5.1.2 节)适用于转换以下规则指定的一个或两个操作数:

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

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

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

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

在类型转换(如果有)之后,值集转换(第 5.1.13 节)将应用于每个操作数。

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

  • 乘法运算符 *、/ 和 %(第 15.17 节)

  • 数字类型 + 和 - 的加法和减法运算符(第 15.18.2 节)

  • 数值比较运算符 <、<=、> 和 >=(第 15.20.1 节)

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

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

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

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

于 2012-05-09T13:15:57.510 回答
2

int+float会给你float(请注意,你必须将结果转换为,float因为double默认情况下使用)。long+double会给你double

于 2012-05-09T13:15:45.823 回答
0

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

如果你在 int 和 float 之间加上 + ,返回值将是一个 float 而 long + double 返回一个 double,

于 2012-05-09T13:16:54.240 回答
0

加法运算符的行为在15.18.2+-定义。JLS数值类型的加法运算符(+ 和 -) 。它声明它首先执行二进制数字提升:

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

这又由5.6.2 定义。二进制数字提升。实质上,对于原语:

  • 如果任一操作数是 double 类型,则另一个操作数将转换为 double。
  • 否则,如果任一操作数的类型为浮点型,则另一个将转换为浮点型。
  • 否则,如果任一操作数是 long 类型,则另一个将转换为 long。
  • 否则,两个操作数都转换为 int 类型。
于 2012-05-09T13:18:03.407 回答
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 中测试)。

于 2012-05-09T13:25:01.973 回答
0

这个“促销”的一个问题是long+float将“扩大”到使用浮点数。

例如

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

印刷

1.11111113E18
1.11111111111111117E18

在处理 long 和 float 时,您可能无法获得更宽的类型,并且可能会损失比您预期的更多的精度。

于 2012-05-09T13:25:07.340 回答