首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java位无符号移位(>>>)给出了奇怪的结果

Java位无符号移位(>>>)给出了奇怪的结果
EN

Stack Overflow用户
提问于 2014-03-16 09:55:33
回答 3查看 185关注 0票数 3

我有这样的代码:

代码语言:javascript
复制
int i = 255;
byte b = (byte) i;
int c;
System.out.println(Integer.toBinaryString( i));
System.out.println("b = " + b); // b = -1
c=b>>>1;
System.out.println(Integer.toBinaryString( c));
System.out.println(c);

但我不明白它是怎么工作的。我认为没有签名的转移到255(11111111)应该会给我127(0111111),但它没有。我的假设是错误的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-16 09:59:35

包括>>>在内的shift运营者在int上操作。在转移之前,b的值是-1,因为byte是签名的,因此它被提升到int。这就是为什么你看到了你看到的结果。

255被重新解释为-1的原因是255将其所有8位都设置为1。当您将其分配给已签名的8位byte类型时,它将被解释为遵循http://en.wikipedia.org/wiki/Two%27s_complement规则的-1

票数 2
EN

Stack Overflow用户

发布于 2014-03-16 10:01:45

这就是如何获得预期结果的方法。

代码语言:javascript
复制
c = (0xFF & b) >>> 1;

详情见dasblinkenlight的答案

票数 1
EN

Stack Overflow用户

发布于 2014-03-16 10:11:32

试试这个,你就会明白:

代码语言:javascript
复制
System.out.println(Integer.toBinaryString(i)); // 11111111
System.out.println(Integer.toBinaryString(b)); // 11111111111111111111111111111111
System.out.println(Integer.toBinaryString(c)); // 1111111111111111111111111111111

变量int i等于255个,所以第一个打印是有意义的。

变量byte b等于-1,因为您将255个存储在一个字节中。

  • 但是当您调用Integer.toBinaryString(b)时,编译器将bbyte转换为int,并将(int)-1 == FFFFFFFFh == 11111111111111111111111111111111b转换为第二次打印。

变量int c等于b>>>1,所以第三次打印是有意义的。

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

https://stackoverflow.com/questions/22435401

复制
相关文章

相似问题

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