C++左移右移操作符研究

- 首先是正常的

int m = 100;

m <<= 1;

cout << m;

Result:200

实际上左移X位等于乘以2的X次方。


- 如果右移的时候除不通怎么办?自己好好地画一个二进制位试试就知道了,实际上是不存在除不通的情况的。

0010 0000 >> 1 = 0001 0000 // 32 / 2 = 16

0010 0001 >> 1 = 0001 0000 // 33 / 2 = 16

表现出来的结果是去尾的。


- 标志位什么的怎么处理?如果是有标志位的数据类型,标志位会移位吗?试试就知道了。

void main()

{

int m = -1;

int n = -1;

m >>= 1;

n <<= 1;

cout << m << endl << n << endl;

}

Result:-1-2


好奇怪,左移成功了,但是右移甚至都没有变化。这是怎么个回事?-- 负数的存储方式是补码存储。

-1 = 11111111 11111111 11111111 11111111

右移保留符号位(注意!!!),左移填零,自己手动一下就知道为什么出现这两种奇怪的结果了。

--- 实际上负数的左右移位本来就是不应该出现的,第一补码难以推测,第二右移的时候是保留符号位还是填零将由编译器决定!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值