Java总是将加法结果转换为int吗?

时间:2016-02-17 18:13:38

标签: java casting implicit

是不是java将原始类型添​​加(如byte + short)结果转换为整数?

3 个答案:

答案 0 :(得分:1)

我怀疑你在谈论promotion。它不像总是推广到int那么简单。 Section 5.1.2详细讨论了原始扩展,但这里有一些指导原则:

  • 如果将结果分配给变量,那么它将被提升为变量的类型(如果可能)
  • 更有限的类型将被提升为更广泛的类型
  • 如果结果可能大于要处理的类型
  • ,则可以提升结果

就像我说的那样,这是对实际规则的简化,但一般来说Java是正确的。

答案 1 :(得分:0)

Java语言规范(JLS)的以下部分适用:

第5.6节数字促销)"数字促销适用于算术运算符的操作数"

第5.6.2.2节二进制数字促销)" ...如果任一操作数的类型为double ... long ... float ...否则两个操作数都转换为int"

因此,在您的byte + short示例中,操作数将首先转换为整数。

进一步说明:

short a = 1;
short b = 2;
short c = a + b;

将产生编译错误"要求short,找到int"。 您需要将加法结果(int)转换为short,如下所示:

short c = (short) (a + b);

答案 2 :(得分:0)

您需要了解参数提升和投射概念。 Java只能评估具有相同类型值的表达式。例如,如果你有表达式a = b + c;那么a和b和c必须具有相同的类型。你现在可能想知道如何在没有任何错误的情况下添加整数和双精度。这就是Java类隐式应用类型提升的概念。在这种情况下,您的整数变量仅在执行操作时隐式更改为double(请记住,整数变量的类型不会更改,只会为表达式创建双重副本)。

现在重点是,如果变量数据没有丢失,java只会隐式使用类型提升。例如,如果将整数更改为double,则不会丢失任何数据。但是如果你想改变让我们说一个值为1.2到整数的双变量那么你将失去分数部分。这是java不会应用类型提升的地方,你需要手动进行类型转换。基本上什么类型的转换意味着控制编译器并告诉编译器我知道我可能会在我的变量中丢失一些数据但是没关系并且为我执行转换。 类型提升和转换发生在表达式和方法调用中。 下表显示了java自动执行的有效促销。

输入有效促销

双无 浮双 长浮动或双浮 int long,float或double
char int,long,float或double
short int,long,float或double(但不是char)
byte short,int,long,float或double(但不是char)
boolean None(布尔值不被视为java中的数字)