移位运算符 - 操作数必须可转换为整数原语吗?

时间:2015-09-28 10:50:57

标签: java java-8 bit-shift

我准备参加Java考试,并且我正在阅读“OCA Java SE 8程序员学习指南”(考试1Z0-808)"。在运营商部分,我发现了这句话:

  

移位运算符:移位运算符需要两个类型必须为的操作数   可转换为整数原语。

我觉得很奇怪,所以我用很长时间测试了它:

public class HelloWorld{

     public static void main(String []args){
         long test = 3147483647L;
         System.out.println(test << 1);

     }
}

并且它有效,没有编译器错误,结果是正确的。这本书有错误还是我误解了书中的引用?

2 个答案:

答案 0 :(得分:10)

移位运算符>><<JLS section 15.19中定义。引用:

  

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

     

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

在谈到“整数原语”时,本书实际上是在谈论“原始整数类型”(在JLS section 4.2.1中定义):

  

整数类型的值是以下范围内的整数:

     
      
  • 对于字节,从-128到127,包括
  •   
  • 简而言之,从-32768到32767,包括
  •   
  • 对于int,从-2147483648到2147483647,包括
  •   
  • 长期,从-9223372036854775808到9223372036854775807,包括在内
  •   
  • 对于char,从'\ u0000'到'\ uffff'(含),即从0到65535
  •   

答案 1 :(得分:4)

他们不是以private bool fullScreen = false; [DefaultValue(false)] public bool FullScreen { get { return fullScreen; } set { fullScreen = value; if (value) { //this.SuspendLayout(); this.WindowState = FormWindowState.Normal; FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; WindowState = FormWindowState.Maximized; //this.ResumeLayout(true); } else { this.Activate(); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable; } } } 方式使用integer,而是使用&#34;整数类型而不是浮点或其他类型&#34;。 Java int也是一个整数,它只是一个64位宽的整数。