c++中的移位操作……填坑系列

首先需要明确一点,计算机中的二进制数都是用其补码表示的,所有的移位运算都是在补码的表示形式上进行操作的,无符号数的补码是其本身,有符号数的补码是符号位不变,其他位求反加1。这里说的很清楚。

无符号数

左移:高位移出,低空位补0。相当于乘以2的n次方

当左移一定位数时,最高位变为1,这时计算机会认为这是一个负数的补码,这时你输出一下计算机就会显示一个负数。如果左移位数超过int类型数值的位数,则会显示为0,因为低空位是用0填补的.比如

int b  = (9<<28); 
cout<<b<<endl;
int b_  = (9<<32); 
cout<<b_<<endl;

右移:低位移出,高空位补0。相当于除以2的n次方

当右移位数超过二进制数字的表示位数时,结果就会变成0,再怎么右移也不会再变,因为会变成0x00000000,也就是0的补码。比如

int b_ = (9>>5);
cout<<b_<<endl;

有符号数

左移:高位移出,低空位补0。

同样的道理,当左移一定位数时,最高位变为0,这时计算机会认为这是一个正数的补码,这时你输出一下计算机就会显示一个正数。如果左移位数超过int类型数值的位数,则会显示为0,因为低空位是用0填补的.比如

int b = (-9<<23); 
cout<<b<<endl;
int b_ = (-9<<28); 
cout<<b_<<endl;
int b__ = (-9<<32); 
cout<<b__<<endl;

右移:低位移出,高空位补1。

当右移位数超过二进制数字的表示位数时,结果就会变成-1,再怎么右移也不会再变,因为最后会变成这个数0xFFFFFFFF,这就是-1的补码,所以不会再变。比如

int b = (-9>>1);
int b_  = (-9>>5); 
cout<<b<<endl;
cout<<b_<<endl;

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值