我有一个示例代码段,如下所示:
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个值吗?
答案 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。