整数在二进制的表示有3种:原码,反码,补码。
正数在二进制的表示的原码,反码,补码都是一样的,
然而负数有所不同,以-3为例:
原码:10000000000000000000000000000011
反码:111111111111111111111111111111111100(反码就是原码的符合位不变,其他位就是按位取反就是反码)
补码:111111111111111111111111111111111101(在反码的基础上加1)
左移操作符:
#include <stdio.h>
int main()
{
int a = 3;
int c = a <<1;
printf("%d", c);
return 0;
}
运行结果:
左移操作符是将补码向左移,<<1向左移动一位,缺就补0。因为此时的3是正整数,所以原码和补码一样,00000000000000000000000000000011。
向左移一位就是00000000000000000000000000000110,所以结果是6。
如果是-3的话向左移一位也就是:
111111111111111111111111111111111101->111111111111111111111111111111111010->111111111111111111111111111111111001->10000000000000000000000000000110
结果是-6
右移操作符有两种运算方法:
算数移位:右边丢弃,左边补原符合位
逻辑移位:右边丢弃,左边补0
右移操作符算数移位:
#include <stdio.h>
int main()
{
int a = 3;
int c = a >>1;
printf("%d", c);
return 0;
}
运行结果:
运行过程:
3的补码是
00000000000000000000000000000011->00000000000000000000000000000001
结果为1.
-3:
-3的补码:111111111111111111111111111111111101->111111111111111111111111111111111110->
111111111111111111111111111111111101->10000000000000000000000000000010
结为负2