2016-02-17 29 views

回答

1

我怀疑你在说的是promotion。它并不像往常一样简单。有关详细的原始加宽,但这里Section 5.1.2会谈有一些指引:

  • 如果结果分配给一个变量,然后它会被晋升为变量的类型(如果可能)
  • 比较有限类型将被提升到了更广阔的类型
  • 一个结果可以,如果它很可能是大于类型将处理

就像我说的,这是实际的规则,简化获得提升,但一般Java做正确的事情。

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; 

将产生一个编译错误 “需要短,实测值INT”。 你需要投加(一个int)的结果为短,像这样:

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

您需要了解参数的推广和铸造概念。 Java只能评估具有相同类型值的表达式。例如,如果你有表达式a = b + c;那么a和b和c必须具有相同的类型。你现在可能会想知道如何在不出现任何错误的情况下添加整数和双精度。这是类型提升的概念被Java隐式应用的地方。在这种情况下,你的整数变量隐含地改变为仅用于执行你的操作的double(记住你的整型变量的类型不改变,只为你的表达式做双重拷贝)。

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

类型             有效促进

双         无
浮动                 双
长                 浮点或双精度
INT                        长,浮动或双
炭               整型,长整型,浮点或者双倍勒
短             整型,长整型,浮点或双(但不是char)
字节               短型,整型,长整型,浮点或双(但不是char)
布尔值   无(布尔值不被视为java中的数字)