标签:java bit-shift binary perl bitwise-operators
当我移位-1时,我正在乱搞并注意到Java和Perl之间我不理解的差异.
我认为整数存储在二进制补码二进制中,所以如果有32位,则-1为11 … 11(32次).
我期待-1>> 1给$2 ^ 31 – 1 $= 011 … 11 = 2147483647.
我期待-1<< 1给出= 11 ... 110 = -2.
这些不同行为的原因是什么?这些标准在不同语言中的位置在哪里?
Perl& amp;的代码和打印输出Java下面:
在Perl中:
print (-1 >> 1, "\n");
print (-1 << 1, "\n");
2147483647
4294967294
在Java中:
public class Tempy {
public static void main(String[] args){
System.out.println( -1 >> 1);
System.out.println( -1 << 1);
}
}
-1
-2
解决方法:
Perl的位移本质上是无符号的,因此-1被视为2 ^ 32 -1并且它自动填充0,因此-1>> 1是2 ^ 31-1和-1 << 1是2 ^ 32-2.
[编辑]感谢@Powerlord使用integer
将强制perl使用签名值.
Java的位移符号扩展(如果使用>>),因此-1<< 1仍是-1并且-1>> 1是-2.如果您不想签署扩展,则必须使用逻辑版本>>>.
标签:java,bit-shift,binary,perl,bitwise-operators 来源: https://codeday.me/bug/20190717/1489136.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。