byte b=(byte)0xf1;
byte c=(byte)(b>>4);//有符号右移
byte d=(byte)(b>>>4);//无符号右移(即高位自动填充0)
byte e=(byte)((b&0xff)>>4);我们都知道在运算中间过程中,byte类型先被提升为int类型后再实行右移运算,在这个程序中,为何c和d的结果一致,也就是说>>>运算符并没有实现我们预期中的功能,而e却实现了,e的结果与我们想象中的b>>>4的结果一致,为什么?
byte c=(byte)(b>>4);//有符号右移
byte d=(byte)(b>>>4);//无符号右移(即高位自动填充0)
byte e=(byte)((b&0xff)>>4);我们都知道在运算中间过程中,byte类型先被提升为int类型后再实行右移运算,在这个程序中,为何c和d的结果一致,也就是说>>>运算符并没有实现我们预期中的功能,而e却实现了,e的结果与我们想象中的b>>>4的结果一致,为什么?
若对char,byte或者short进行移位处理,那么在移位进行之前,它们会自动转换成一个int。只有右侧的5个低位才会用到。这样可防止我们在一个int数里移动不切实际的位数。若对一个long值进行处理,最后得到的结果也是long。此时只会用到右侧的6个低位,防止移动超过long值里现成的位数。但在进行“无符号”右移位时,也可能遇到一个问题。若对byte或short值进行右移位运算,得到的可能不是正确的结果(Java 1.0和Java 1.1特别突出)。它们会自动转换成int类型,并进行右移位。但“零扩展”不会发生,所以在那些情况下会得到-1的结果。