原始促销>> 【JAVA]

时间:2016-04-11 21:14:54

标签: java primitive-types promotions

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

byte a = 2;
int b = a >> 4L;

我期待什么?

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

int >> long会提升为更大的数据类型(long),并且不会使用结果int类型进行编译。

我收到了什么?

编译好。的为什么吗

2 个答案:

答案 0 :(得分:3)

这里JLS不会“提升到更大的数据类型”,因为它不会为转移运算符执行二进制数字提升。这由JLS, Section 15.19涵盖。

  

对每个操作数分别执行一元数字提升(第5.6.1节)。 (二进制数字提升(第5.6.2节)在操作数上执行 。)

一元数字促销将字节a提升为int。文字4L没有改变,但无论如何它只需要是一个整体类型。

  

如果在一元数字提升之后移位运算符的每个操作数的类型不是基本的整数类型,那么这是一个编译时错误。

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

  

如果左侧操作数的提升类型是int,则只使用右侧操作数的五个最低位作为移位距离。就好像右手操作数受到按位逻辑AND运算符&amp; (§15.22.1),掩码值为0x1f(0b11111)。因此,实际使用的移动距离始终在0到31的范围内,包括0和31。

运算符的结果是int,而不是long,因此可以在没有编译器错误的情况下将其分配给int

  

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

答案 1 :(得分:1)

通过JLS

  

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

移位运算符的右侧操作数对表达式的类型没有任何影响。与+之类的运算符不同,右侧较大的类型并不意味着结果可能更大或更小。

相关问题