在计算机中,数值是以补码来表示和存储的。所以移位运算都是在“补码”上进行操作的。
原码转补码
正数的补码与原码相同。
负数的补码:符号位为1,其余位是原码按位取反(反码),然后整个数加1。补码转原码
补码的符号位为0,正数的原码=补码
补码的符号位为1,负数的原码=补码的补码。即符号位不变(1),其余各位取反,再加1.
-5的源码:
1000 0101
补码:
1111 1011
按位右移:
cout << (-5>>1) << endl;
补码左移:1111 1011 -> 1111 1101
输出源码,1111 1101的原码为:
1000 0011 (十进制:-3)
按位左移:
cout << (-5<<1) << endl;
补码左移:1111 1011 -> 1111 0110
输出原码:1111 0110 -> 10001010 (十进制:-10)