引自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
感谢您的帮助
答案 0 :(得分:5)
听起来是这样的:有8位,保持2 ^ 8 = 256个可能的值。它已签名,因此范围为frmo -128到127(256个值)。最重要的位的值为-128。
在Java中,二进制数字提升与b >>> b1
等操作一起发生。这两种类型都会提升为int
,结果为int
。但是,您可以将结果显式地转换回byte
。
这是演员:
byte b2 = (byte) (b >>> b1);
JLS, Section 5.6.2,讨论二进制数字推广:
扩展基元转换(第5.1.2节)用于转换或 两个操作数由以下规则指定:
如果任一操作数的类型为double,则另一个操作数转换为double。
否则,如果任一操作数的类型为float,则转换另一个操作数 漂浮。
否则,如果任一操作数的类型为long,则转换另一个操作数 很久。
否则,两个操作数都将转换为int类型。
(强调我的)