在介绍移位操作符前,我们先介绍一下原码反码和补码
这里要讲的左移和右移牵扯到原码补码和反码,
原码即这个整数转化为2进制时的一串,
正整数的原码、反码、补码相同,
10(int类型)的原码:00000000000000000000000000001010
10(int类型)的反码:00000000000000000000000000001010
10(int类型)的补码:00000000000000000000000000001010
而负整数的原码、反码、补码各不相同,
原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码
补码:反码+1就得到补码
(补码得到原码可以使用:取反,+1的操作)
-10(int类型)的原码:10000000000000000000000000001010
-10(int类型)的反码:11111111111111111111111111110101
-10(int类型)的补码:11111111111111111111111111110110
对于整形来说,数据存放内存中其实存放的是补码
<< 左移操作符,移位规则:左边抛弃,右边补0
>> 右移操作符,分为逻辑右移和算数右移,
逻辑右移:左边用0填充,右边丢弃,
算数右移,左边用原该值的符号位填充,右边丢弃,
这个取决于编译器,常见的编译器使用的是算数右移,那么我们下面就围绕算术右移来展开讲解,
先来看正整数,
我们先来看b,
这里a的反码为00000000000000000000000000001010,
下面一行是向左移一个单位,后面补0,
然后转换为原码,(正整数的原码反码补码相同)
变成00000000000000000000000000010100,即b=20,
同理可知c变为00000000000000000000000000000101,即c=5,
下面我们来看一下负整数,
其中b的算法与正整数相同,
下面来看一下c,
下面一行是向右移一个单位,前面用原该值的符号位填充,
变成11111111111111111111111111111011,
然后转换成原码,
原码=补码取反+1,
即变成10000000000000000000000000000101,即c=-5
注:移位操作符的操作数是能是整数,且移动位数不要写负数,
(这里可以发现一个规律,右移会将整数的绝对值*2,后面也可以使用这个特征)