6

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

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

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

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

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

谢谢你的帮助

4

1 回答 1

5
  1. 听起来像:有 8 位,包含 2^8 = 256 个可能的值。它已签名,因此范围是从 -128 到 127(256 个值)。最高有效位的值为 -128。

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

这是演员表:

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

JLS第5.6.2 节讨论了二进制数字提升:

加宽原语转换(第 5.1.2 节)适用于转换以下规则指定的一个或两个操作数:

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

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

否则,如果任一操作数是 long 类型,则另一个将转换为 long。

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

(强调我的)

于 2013-10-17T18:27:41.873 回答