【问题标题】:>> and >>> operator with negative byte value in java>> 和 >>> 运算符在 java 中具有负字节值
【发布时间】:2018-04-16 03:41:25
【问题描述】:

我有一个这样的示例代码 sn-p:

    byte a = -0b00001111;
    byte b = a;
    byte c = a;

    System.out.println("a=" + a );
    System.out.println("b=" + (b >> 1) );
    System.out.println("c=" + (c >>> 1) );

然后,它会打印:

a=-15

b=-8

c=2147483640

我不太明白 b 和 c 是如何分别成为这 2 个值的,有人可以逐步演示一下这两个值是如何计算的吗?

【问题讨论】:

    标签: java operators byte negative-number


    【解决方案1】:

    对于字节a,你有文字0b00001111,它是15的二进制,所以a-15byte-15 的位表示为:

    11110001
    

    在 Java 中,unary numeric promotion occurs 位于位移运算符 <<>>>>> 的操作数上。

    一元数字提升(第 5.6.1 节)分别对每个操作数执行。

    这意味着值在移位之前被提升为int

    代码(b >> 1)b 提升为int,然后使用符号扩展名移动值。这意味着如果该值已经是负数,则移动 1 位以确保它仍然是负数。

    11110001
    

    晋升为

    11111111 11111111 11111111 11110001
    

    这是-15 作为int。右移一位后,带符号扩展:

    11111111 11111111 11111111 11111000
    

    这是-8

    但是,对于代码 (c >>> 1)>>> 无符号右移运算符执行符号扩展,即使提升到 int 确实保持符号和值。

    11110001
    

    晋升为

    11111111 11111111 11111111 11110001
    

    与以前一样,-15int。无符号右移一位后:

    01111111 11111111 11111111 11111000
    

    第一位现在是0。如果没有设置最高有效位,该值现在是 231 - 8,或 2147483640。

    【讨论】:

    • 对我迟来的“谢谢”深表歉意!感谢您的详细解释,非常有帮助!
    猜你喜欢
    • 1970-01-01
    • 2011-11-27
    • 2019-04-14
    • 1970-01-01
    • 2012-10-13
    • 2015-01-09
    • 2013-02-17
    相关资源
    最近更新 更多