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

来源:互联网 发布:程序员能做到多少岁 编辑:程序博客网 时间:2024/06/05 05:12

- 首先是正常的

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

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

--- 实际上负数的左右移位本来就是不应该出现的,第一补码难以推测,第二右移的时候是保留符号位还是填零将由编译器决定!
原创粉丝点击