繁体   English   中英

Java中short,int,long,double,float之间的强制转换

[英]casting between short,int,long,double,float in Java

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

这全部由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。

    • 否则,如果其中一个操作数的类型为float,则另一个将转换为float。

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

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

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

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

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

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

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

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

  • 整数按位运算符&,^和| (第15.22.1节)

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

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

int + float将为您提供float (请注意,由于默认情况下使用double因此您必须将结果强制转换为float )。 long + double将使您double

仍将返回可以容纳整个值的"bigger"类型。 在您的特定问题

如果您在int和float之间输入+,则返回值为float,而long + double返回double,

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

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

依次5.6.2定义 二进制数值提升 本质上,对于基元:

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

关于类型转换,有两个有趣的常见问题解答,可以在以下网址找到: 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中进行了测试)。

这种“促销”的陷阱是long + float将“扩大”为使用浮点数。

例如

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

版画

1.11111113E18
1.11111111111111117E18

在处理long和float时,您可能不会得到更宽的类型,并且可能会失去比预期更高的精度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM