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

6

引用自oracle网站, "byte:字节数据类型是一种8位带符号的二进制补码整数。 它的最小值为-128,最大值为127(包括在内)"。

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

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

问题1:什么是8位有符号?128的二进制格式为1000 0000,而-128需要一个额外的比特来表示负号,如果所有8个比特都被占用,则会放在哪里。

问题2:对于int类型,存在无符号右移运算符,但是对于字节来说似乎不合法,为什么?在字节的情况下,溢出不能被防止吗?在int的情况下,它可以工作

感谢您的帮助!

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类型。

否则,如果任何一个操作数是float类型,那么另一个操作数将会被转换成float类型。

否则,如果任何一个操作数是long类型,那么另一个操作数将会被转换成long类型。

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

(强调为本人所加)


byte 的值视为所有 8 位的值之和:-128、64、32、16、8、4、2 和/或 1。 - rgettman
这意味着1000 0000的8位表示应该是-128而不是128吗? - eagertoLearn
对的,-128 被表示为 1000 0000,而 127 被表示为 0111 1111。这也意味着 -1 被表示为 1111 1111 - rgettman
谢谢你的澄清。但是,既然你提到“-1”表示为“1111 1111”,我有点困惑。请再解释一下。谢谢! - eagertoLearn
1
“-128” 是 “1000 0000”,从这里开始往回数,像这样:“-127” 是 “1000 0001”,“-126” 是 “1000 0010”,“-125” 是 “1000 0011”,.. “-1” 是 “1111 1111”,“0” 是 “0000 0000”。 - Stijn de Witt
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接