在Java推广?

时间:2009-11-02 11:55:47

标签: java

促销规则是“当操作数属于不同类型时,自动二进制数字提升会发生,较小的操作数类型会转换为较大的”。但操作数是相同的类型,例如,

byte=byte+byte // Compile time error... found int..

那为什么会这样呢?

5 个答案:

答案 0 :(得分:42)

byte没有+运算符。相反,两个操作数都被提升为int,所以你有

byte = byte + byte
... becomes (widening to find + operator) ...
byte = int + int
... becomes (result of + operator) ...
byte = int 

...然后失败,因为没有从intbyte的隐式转换。你需要施放:

byte a = 1;
byte b = 2;

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

以下是来自section 5.6.2 of the JLS的数字促销的实际规则:


当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示可转换为数字类型的值,以下规则依次使用扩展转换(第5.1.2节)进行转换必要时操作数:

  • 如果任何操作数是引用类型,则执行拆箱转换(第5.1.8节)。然后:
  • 如果任一操作数的类型为double,则另一个操作数将转换为double。
  • 否则,如果任一操作数的类型为float,则另一个操作数转换为float。
  • 否则,如果任一操作数的类型为long,则另一个操作数将转换为long。
  • 否则,两个操作数都将转换为int。

答案 1 :(得分:17)

您收到了关于自动升级到'int'的正确答案。

还有一点需要注意 - 复合赋值运算符的行为与它们具有隐式类型的情况相同。例如:

byte b1 = 1;
byte b2 = 2;
b1 = b1 + b2; // compilation fails
b1 += b2; // compilation successful

答案 2 :(得分:2)

要了解这一点,您应该参考两件事:

隐式投射: 字节(8位)->短(16位)->整数(32位)->浮点(32位)->双精度(64位) char(16位)-> int(32位)

算术运算符规则

  1. 运算符优先级规则:此规则指出(*,/,%)组将首先被评估。然后将对(+,-)组运算符进行评估。在同一组运算符中,从左侧开始计算。

  2. 操作数提升规则:此规则指出,数据类型小于int的操作数将被提升为int。升级顺序(byte-> short-> int,char-> int)

  3. 相同类型的操作数规则:该规则指出,如果两个操作数均为int,long,float,double,则将相同类型携带到结果类型。 即long + long => long,float + float => float,int + int => int

  4. 混合类型操作数规则:如果任何操作数来自上述顺序,则遵循升序的顺序(int-> long-> float-> double),则较小的将被提升为较大的一个,结果将以更大的类型计算。 即long + double => double,int + long => long

答案 3 :(得分:1)

我想谈谈一般的推广活动

  

Java只能评估操作数类型相同的算术表达式

例如,在包含int和double值的表达式中,int值将提升为double值,以便在表达式中使用。

换句话说

<div class="cart"><product [itemAdded]="valueCommingfromService" (click)="myMethod()"></product></div>

double someVar = 1 / 2;// someVar = 0

为什么呢?

  • 我们使用(双)double someVar = (double)1 / 2;// someVar = 0.5 来创建cast operator 其操作数temporary的浮点副本(它被称为"1"
  • 现在计算包含一个浮点值(1的临时双重副本)除以整数2
  • 根据上面的陈述,Java执行一个名为explicit conversion(或隐式转换)的操作,因此promotion被提升为int values以使用double values表达式= &GT;整数2被提升为double
  • 表达式变为in

希望这有用,即使它不在问题的核心

答案 4 :(得分:0)

this SO question开始,以及由+算术运算符引起的上述答案,两个操作数都转换为int类型。

byte b1 = 1;
byte b2 = 2;
byte b3 = b1 + b2; // compile time error

在上面的代码中,b1b2的值将在运行时解析,因此编译器会在解析值之前将它们都转换为int

但是如果我们考虑以下代码,

final byte b1 = 1;
final byte b2 = 2;
int b3 = b1 + b2; // constant expression, value resolved at compile time

b1b2是最终变量,值将在编译时解析,因此编译不会失败。