提升规则是“当操作数的类型不同时,自动进行二进制数字提升,将较小的操作数类型转换为较大的操作数类型”。但操作数的类型是相同的例如,
byte=byte+byte // Compile time error... found int..
为什么会这样?
zvms9eto1#
我想谈谈一般的晋升java只能计算操作数类型相同的算术表达式例如,在包含int和double值的表达式中,int值将提升为double值以在表达式中使用。换句话说
double someVar = 1 / 2;// someVar = 0
但是
double someVar = (double)1 / 2;// someVar = 0.5
为什么?我们使用(双) cast operator 创建 temporary 其操作数的浮点副本 "1" (这叫 explicit conversion )现在的计算由浮点值(1的临时双副本)除以整数2组成根据上面的语句,java执行一个名为 promotion (或隐式转换),所以 int values 被提升为 double values 供使用 in 表达式=>整数2提升为双精度表情变得 double someVar = 1.0 / 2.0; // someVar= 0.5 希望这是有帮助的,即使它是出了问题的核心
cast operator
temporary
"1"
explicit conversion
promotion
int values
double values
in
double someVar = 1.0 / 2.0; // someVar= 0.5
hsvhsicv2#
从这个所以的问题,和以上的答案由于 + 算术运算符,两个操作数都转换为类型 int .
+
int
byte b1 = 1; byte b2 = 2; byte b3 = b1 + b2; // compile time error
在上述代码中 b1 以及 b2 将在运行时解析,所以编译器将两者转换为 int 在解析值之前。但如果我们考虑以下代码,
b1
b2
final byte b1 = 1; final byte b2 = 2; int b3 = b1 + b2; // constant expression, value resolved at compile time ``` `b1` 以及 `b2` 是最终变量,值将在编译时解析,因此编译不会失败。
khbbv19g3#
要理解这一点,您应该参考以下两件事:隐式转换:字节(8位)->短(16位)->int(32位)->浮点(32位)->双(64位)字符(16位)->int(32位)算术运算符规则运算符优先规则:此规则说明将首先计算(*,/,%)组。然后对一组(+,-)运算符进行求值。从同一组运算符中,从左侧开始计算。操作数提升规则:此规则说明数据类型小于int的操作数将提升为int。提升顺序(byte->short->int,char->int)同一类型操作数规则:该规则规定,如果两个操作数都是int、long、float、double,则将同一类型带到结果类型。i、 例如,long+long=>long,float+float=>float,int+int=>int混合型操作数规则:按照提升顺序(int->long->float->double)如果有任何操作数来自上述顺序,则较小的操作数将提升为较大的操作数,结果将按较大的类型计算。i、 e.long+double=>double,int+long=>long
83qze16e4#
没有+运算符 byte . 相反,两个操作数都提升为int,因此
byte
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);
以下是jls第5.6.2节中数字提升的实际规则:当运算符将二进制数字提升应用于一对操作数(每对操作数必须表示可转换为数字类型的值)时,使用加宽转换按顺序应用以下规则(§5.1.2)要根据需要转换操作数:如果任何操作数是引用类型,则取消装箱转换(§5.1.8)执行。然后:如果其中一个操作数的类型为double,则另一个操作数将转换为double。否则,如果其中一个操作数的类型为float,则另一个操作数将转换为float。否则,如果其中一个操作数的类型为long,则另一个操作数将转换为long。否则,两个操作数都转换为int类型。
yyyllmsg5#
我们为您提供了关于自动升级为“int”的正确答案。还有一点需要注意的是,复合赋值运算符的行为就像它们具有隐式类型大小写一样。例子:
byte b1 = 1; byte b2 = 2; b1 = b1 + b2; // compilation fails b1 += b2; // compilation successful
5条答案
按热度按时间zvms9eto1#
我想谈谈一般的晋升
java只能计算操作数类型相同的算术表达式
例如,在包含int和double值的表达式中,int值将提升为double值以在表达式中使用。
换句话说
但是
为什么?
我们使用(双)
cast operator
创建temporary
其操作数的浮点副本"1"
(这叫explicit conversion
)现在的计算由浮点值(1的临时双副本)除以整数2组成
根据上面的语句,java执行一个名为
promotion
(或隐式转换),所以int values
被提升为double values
供使用in
表达式=>整数2提升为双精度表情变得
double someVar = 1.0 / 2.0; // someVar= 0.5
希望这是有帮助的,即使它是出了问题的核心hsvhsicv2#
从这个所以的问题,和以上的答案由于
+
算术运算符,两个操作数都转换为类型int
.在上述代码中
b1
以及b2
将在运行时解析,所以编译器将两者转换为int
在解析值之前。但如果我们考虑以下代码,
khbbv19g3#
要理解这一点,您应该参考以下两件事:
隐式转换:字节(8位)->短(16位)->int(32位)->浮点(32位)->双(64位)字符(16位)->int(32位)
算术运算符规则
运算符优先规则:此规则说明将首先计算(*,/,%)组。然后对一组(+,-)运算符进行求值。从同一组运算符中,从左侧开始计算。
操作数提升规则:此规则说明数据类型小于int的操作数将提升为int。提升顺序(byte->short->int,char->int)
同一类型操作数规则:该规则规定,如果两个操作数都是int、long、float、double,则将同一类型带到结果类型。i、 例如,long+long=>long,float+float=>float,int+int=>int
混合型操作数规则:按照提升顺序(int->long->float->double)如果有任何操作数来自上述顺序,则较小的操作数将提升为较大的操作数,结果将按较大的类型计算。i、 e.long+double=>double,int+long=>long
83qze16e4#
没有+运算符
byte
. 相反,两个操作数都提升为int,因此... 因为没有从
int
至byte
. 你需要施展:以下是jls第5.6.2节中数字提升的实际规则:
当运算符将二进制数字提升应用于一对操作数(每对操作数必须表示可转换为数字类型的值)时,使用加宽转换按顺序应用以下规则(§5.1.2)要根据需要转换操作数:
如果任何操作数是引用类型,则取消装箱转换(§5.1.8)执行。然后:
如果其中一个操作数的类型为double,则另一个操作数将转换为double。
否则,如果其中一个操作数的类型为float,则另一个操作数将转换为float。
否则,如果其中一个操作数的类型为long,则另一个操作数将转换为long。
否则,两个操作数都转换为int类型。
yyyllmsg5#
我们为您提供了关于自动升级为“int”的正确答案。
还有一点需要注意的是,复合赋值运算符的行为就像它们具有隐式类型大小写一样。例子: