【问题标题】:signed byte type and bitwise operators in Java?Java中的有符号字节类型和按位运算符?
【发布时间】:2013-10-17 18:24:44
【问题描述】:

引用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

感谢您的帮助

【问题讨论】:

    标签: java int byte bit-manipulation


    【解决方案1】:
    1. 听起来就是这样:有 8 位,包含 2^8 = 256 个可能的值。它已签名,因此范围是从 -128 到 127(256 个值)。最高有效位的值为 -128。

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

    演员表如下:

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

    JLS, Section 5.6.2,谈论二进制数字提升:

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

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

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

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

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

    (强调我的)

    【讨论】:

    • 谢谢,就 8 位而言,符号在哪里? +- 应该是 8 位的一部分吧?
    • byte 的值视为所有 8 位值的总和:-128、64、32、16、8、4、2 和/或 1。跨度>
    • 这意味着1000 0000的8位表示应该是-128?而不是 128.?
    • 对,-128表示为1000 0000127表示为0111 1111。这也意味着-1 表示为1111 1111
    • '-128' 是 '1000 0000',从那里你可以像这样倒数到零:'-127' 是 '1000 0001', '-126' = '1000 0010', '- 125' = '1000 0011', .. '-1' 是 '1111 1111', '0' 是 '0000 0000'
    猜你喜欢
    • 2012-11-12
    • 2015-03-24
    • 2013-07-25
    • 2013-05-23
    • 1970-01-01
    • 2020-08-18
    • 2023-04-09
    • 1970-01-01
    • 2010-11-05
    相关资源
    最近更新 更多