原始促销>> [Java]

And*_*lko 5 java promotions primitive-types

我在下一个代码片段中遇到了对原始促销的误解.

byte a = 2;
int b = a >> 4L;
Run Code Online (Sandbox Code Playgroud)

我会期待什么?

long b = (int)a >> 4L;
long b = a >> 4L;
int b = a >> 4L;

int >> long将升级到更大的数据类型(long),它将不会使用结果int类型进行编译.

我收到了什么?

它汇编很好.为什么?

rge*_*man 3

JLS 不会在这里“提升到更大的数据类型”,因为它不会对移位运算符执行二进制数字提升。JLS 第 15.19 节涵盖了这一点。

\n\n
\n

一元数字提升 (\xc2\xa75.6.1) 分别对每个操作数执行。(不对操作数执行二进制数字提升 (\xc2\xa75.6.2) 。)

\n
\n\n

一元数字提升将字节提升aint. 文字4L没有改变,但无论如何它只需要是一个整数类型。

\n\n
\n

如果在一元数值提升之后,移位运算符的每个操作数的类型不是原始整型,则这是一个编译时错误。

\n
\n\n

然后对于移位,仅使用最低 5 个有效位来移位int

\n\n
\n

如果左侧操作数的提升类型为 int,则仅使用右侧操作数的最低 5 位作为移位距离。就好像右侧操作数受到掩码值为 0x1f (0b11111) 的按位逻辑 AND 运算符 & (\xc2\xa715.22.1) 的影响。因此,实际使用的移位距离始终在 0 到 31 的范围内(包含 0 和 31)。

\n
\n\n

运算符的结果是 an int,而不是 a long,因此可以将其分配给 anint而不会出现编译器错误。

\n\n
\n

移位表达式的类型是左侧操作数的提升类型。

\n
\n