ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java-左移签名行为

2019-10-10 06:04:42  阅读:241  来源: 互联网

标签:java int bit-shift signed


public class Shift {

    public static void main(String[] args) {
        for(int i = 0; i < 32; ++i){
            System.out.println(-0x55555555 << i);
        }
    }

}

运行上面的代码给出以下输出

-1431655765
1431655766
-1431655764
1431655768
-1431655760
1431655776
-1431655744
1431655808
-1431655680
1431655936
-1431655424
1431656448
-1431654400
1431658496
-1431650304
1431666688
-1431633920
1431699456
-1431568384
1431830528
-1431306240
1432354816
-1430257664
1434451968
-1426063360
1442840576
-1409286144
1476395008
-1342177280
1610612736
-1073741824
-2147483648

使用其他值(64)进行测试时,结果会更好

public class Shift {

    public static void main(String[] args) {
        for(int i = 0; i < 32; ++i){
            System.out.println(-0x40 << i);
        }
    }

}

产量

-64
-128
-256
-512
-1024
-2048
-4096
-8192
-16384
-32768
-65536
-131072
-262144
-524288
-1048576
-2097152
-4194304
-8388608
-16777216
-33554432
-67108864
-134217728
-268435456
-536870912
-1073741824
-2147483648
0
0
0
0
0
0

the specs (§15.19)中说:

n << 1的值. s是n个左移的s位位置;这等效于(即使发生溢出)乘以2的幂s.

有人可以解释为什么第一个输出吗?

解决方法:

The value of n << s is n left-shifted s bit positions; this is equivalent (even if overflow occurs) to multiplication by two to the power s.

的确是这样:由于溢出,如果将-0x55555555乘以s的幂,这就是您得到的结果.特别是0x55555555具有交替的0和1,因此您要将交替的0和1移入符号位,因此符号每次都在翻转.

标签:java,int,bit-shift,signed
来源: https://codeday.me/bug/20191010/1884725.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有