促销规则是“当操作数属于不同类型时,自动二进制数字提升会发生,较小的操作数类型会转换为较大的”。但操作数是相同的类型,例如,
byte=byte+byte // Compile time error... found int..
那为什么会这样呢?
答案 0 :(得分:42)
byte
没有+运算符。相反,两个操作数都被提升为int,所以你有
byte = byte + byte
... becomes (widening to find + operator) ...
byte = int + int
... becomes (result of + operator) ...
byte = int
...然后失败,因为没有从int
到byte
的隐式转换。你需要施放:
byte a = 1;
byte b = 2;
byte c = (byte) (a + b);
以下是来自section 5.6.2 of the JLS的数字促销的实际规则:
当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示可转换为数字类型的值,以下规则依次使用扩展转换(第5.1.2节)进行转换必要时操作数:
答案 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位)
算术运算符规则
运算符优先级规则:此规则指出(*,/,%)组将首先被评估。然后将对(+,-)组运算符进行评估。在同一组运算符中,从左侧开始计算。
操作数提升规则:此规则指出,数据类型小于int的操作数将被提升为int。升级顺序(byte-> short-> int,char-> int)
相同类型的操作数规则:该规则指出,如果两个操作数均为int,long,float,double,则将相同类型携带到结果类型。 即long + long => long,float + float => float,int + int => int
混合类型操作数规则:如果任何操作数来自上述顺序,则遵循升序的顺序(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"
)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
在上面的代码中,b1
和b2
的值将在运行时解析,因此编译器会在解析值之前将它们都转换为int
。
但是如果我们考虑以下代码,
final byte b1 = 1;
final byte b2 = 2;
int b3 = b1 + b2; // constant expression, value resolved at compile time
b1
和b2
是最终变量,值将在编译时解析,因此编译不会失败。