>>和>>> java中具有负字节值的运算符

时间:2018-04-16 03:41:26

标签: java operators byte negative-number

我有一个示例代码段,如下所示:

    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) );

并打印:

α= -15

B = -8

C = 2147483640

我不太明白b和c是如何分别成为这2个值的,有人可以告诉我如何计算这2个值吗?

1 个答案:

答案 0 :(得分:1)

对于字节a,您有文字0b00001111,它是15的二进制文件,因此a-15-15的{​​{1}}的位代表是:

byte

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

  

对每个操作数分别执行一元数字提升(第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 一样-15。无符号转移到右边一位后:

int

第一位现在是01111111 11111111 11111111 11111000 。如果没有设置最高位,则该值现在为2 31 - 8或2147483640。