Java中的有符号字节类型和按位运算符?

时间:2013-10-17 18:24:44

标签: java int byte bit-manipulation

引自oracle website“字节:字节数据类型是一个8位带符号的二进制补码整数。它的最小值为-128,最大值为127(含)”。

这里,前两行有效,但最后一行不是

            byte b = -128;
        byte b1 = 127;
        byte b2 = b>>>b1;//illegal

Q1)8位签名究竟是什么意思? 128的二进制格式将是1000 0000和-128将需要额外的位用于负号,如果所有8位都被占用它将适合。

Q2)对于int,有一个无符号右移运算符,但这对于字节来说似乎是非法的,为什么会这样。在字节的情况下,不能防止溢出。在case of int, it works

感谢您的帮助

1 个答案:

答案 0 :(得分:5)

  1. 听起来是这样的:有8位,保持2 ^ 8 = 256个可能的值。它已签名,因此范围为frmo -128到127(256个值)。最重要的位的值为-128。

  2. 在Java中,二进制数字提升b >>> b1等操作一起发生。这两种类型都会提升为int,结果为int。但是,您可以将结果显式地转换回byte

  3. 这是演员:

    byte b2 = (byte) (b >>> b1);
    

    JLS, Section 5.6.2,讨论二进制数字推广:

      

    扩展基元转换(第5.1.2节)用于转换或   两个操作数由以下规则指定:

         

    如果任一操作数的类型为double,则另一个操作数转换为double。

         

    否则,如果任一操作数的类型为float,则转换另一个操作数   漂浮。

         

    否则,如果任一操作数的类型为long,则转换另一个操作数   很久。

         

    否则,两个操作数都将转换为int类型。

    (强调我的)