C语言移位操作符分别是左移操作符"<<"和右移操作符">>",移动的是补码,计算的是原码。
先来说一说右移,右移采用的是算术右移,算术右移指计算的是正数,左边就补0,是负数,左边就补1,我们来随机验证一个数2和-2得到的结果看看。
2的原、反、补相同:00000000 00000000 00000000 00000010
右移一位:00000000 00000000 00000000 00000001
得到的结果是1,编译器如下:
-2的原、反、补不同:
原码:10000000 00000000 00000000 00000010
反码:111111111 111111111 111111111 111111101
补码:111111111 111111111 111111111 111111110
右移一位:111111111 111111111 111111111 111111111
-1:111111111 111111111 111111111 111111110
取反:10000000 00000000 00000000 00000001
得到的结果是-1,编译器如下:
再来说一说左移,左移比右移简单,左边丢弃,右边都是补0,我们来随机验证一个数2和-2得到的结果看看。
2的原、反、补相同:00000000 00000000 00000000 00000010
左移一位:00000000 00000000 00000000 00000100
得到的结果是4,编译器如下:
-2的原、反 、补不相同:
原码:10000000 00000000 00000000 00000010
反码:111111111 111111111 111111111 111111101
补码:111111111 111111111 111111111 111111110
左移一位:111111111 111111111 111111111 111111100
-1:111111111 111111111 111111111 111111011
取反:10000000 00000000 00000000 00000100
得到的结果是-4,编译器如下:
总结,我们讲了左移和右移操作符,左移操作符比右移操作符简单,左边丢弃,不管正负数右边直接补0;正数的原、反、补相同,可以很快算出结果,而负数则要是先转成补码,位移用补码,计算用原码。而右移操作符如果计算的是正数,左边补0,计算的是负数,左边补1。