无符号右移>>>

public class Test {
	public static void main(String args[]) {
		byte b = (byte) 0xf1;
		byte c = (byte) (b >> 4);
		byte d = (byte) (b >>> 4);
		byte e = (byte) ((b & 0xff) >> 4);
		
		System.out.println(b);
		System.out.println(c);
		System.out.println(d);
		System.out.println(e);
	}
}

 

以上结果是:

-15
-1
-1
15

 

貌似无符号右移失效了,变成有符号右移了,这是怎么回事呢,原因是java双目运算符参与运算时操作数被提升为int了,看一解释:

 

byte a = -64;
byte b = (byte)(a >>> 4);

这里 a = 11000000b,那么无符号右移4位的结果应为 00001100b,即 b = 12。但是实际的执行结果为 b = -4,即 11111100b。

得到这个错误结果的原因是,Java中任何双目运算的运算数都会首先被扩展为 int,然后再进行运算。在这里运算过程如下:

byte 型 11000000 扩展为 int 型 11111111 11111111 11111111 11000000

无符号右移4位 00001111 11111111 11111111 11111100

强制转换为 byte 型 11111100

从上面的过程中我们可以得出结论,对于比int还要小的数值类型(short、byte)不应当进行无符号右移运算。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值