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类型进行编译.
我收到了什么?
它汇编很好.为什么?
JLS 不会在这里“提升到更大的数据类型”,因为它不会对移位运算符执行二进制数字提升。JLS 第 15.19 节涵盖了这一点。
\n\n\n\n\n一元数字提升 (\xc2\xa75.6.1) 分别对每个操作数执行。(不对操作数执行二进制数字提升 (\xc2\xa75.6.2) 。)
\n
一元数字提升将字节提升a为int. 文字4L没有改变,但无论如何它只需要是一个整数类型。
\n\n\n如果在一元数值提升之后,移位运算符的每个操作数的类型不是原始整型,则这是一个编译时错误。
\n
然后对于移位,仅使用最低 5 个有效位来移位int。
\n\n\n如果左侧操作数的提升类型为 int,则仅使用右侧操作数的最低 5 位作为移位距离。就好像右侧操作数受到掩码值为 0x1f (0b11111) 的按位逻辑 AND 运算符 & (\xc2\xa715.22.1) 的影响。因此,实际使用的移位距离始终在 0 到 31 的范围内(包含 0 和 31)。
\n
运算符的结果是 an int,而不是 a long,因此可以将其分配给 anint而不会出现编译器错误。
\n\n移位表达式的类型是左侧操作数的提升类型。
\n
| 归档时间: |
|
| 查看次数: |
185 次 |
| 最近记录: |