首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >应用于字节变量的无符号右移的行为

应用于字节变量的无符号右移的行为
EN

Stack Overflow用户
提问于 2010-10-16 16:54:47
回答 4查看 10.8K关注 0票数 24

考虑下面的java代码片段

byte b=(byte) 0xf1;
byte c=(byte)(b>>4);
byte d=(byte) (b>>>4);

输出:

c=0xff
d=0xff

预期输出:

c=0x0f

多么?在无符号右移位之后,作为二进制1111 0001中的b,因此是0x0f,但是为什么是0xff

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-10-16 17:18:02

问题是,在进行移位操作之前,所有参数都首先被提升为int

byte b = (byte) 0xf1;

b是带符号的,所以它的值为-15。

byte c = (byte) (b >> 4);

b首先被符号扩展为整数-15 = 0xfffffff1,然后向右移位为0xffffffff,并通过转换为0xff将其截断为byte

byte d = (byte) (b >>> 4);

b首先被符号扩展为整数-15 = 0xfffffff1,然后向右移位为0x0fffffff,并通过转换为0xff将其截断为byte

你可以做(b & 0xff) >>> 4来得到想要的效果。

票数 43
EN

Stack Overflow用户

发布于 2010-10-16 17:13:48

我猜在进行转换之前,b是对int进行了符号扩展。

因此,这可能会像预期的那样工作:

(byte)((0x000000FF & b)>>4)
票数 5
EN

Stack Overflow用户

发布于 2010-10-16 17:19:02

Java试图通过定义两个不同的移位操作符来避免显式地支持无符号基本类型。

这个问题谈到了无符号右移位,但示例同时做了(有符号和无符号),并显示了有符号移位的值(>>)。

对于无符号移位(>>>),您的计算将是正确的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3948220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档