- 首先是正常的
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
右移保留符号位(注意!!!),左移填零,自己手动一下就知道为什么出现这两种奇怪的结果了。
--- 实际上负数的左右移位本来就是不应该出现的,第一补码难以推测,第二右移的时候是保留符号位还是填零将由编译器决定!