这篇文章主要介绍了c语言中的移位运算符,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
移位运算符是编程中的一种位运算运算符。移位运算符可以对二进制数进行移位。
C:
中提供了两个移位运算符
左移运算符:lt;lt;
右移运算符:gt;gt;
左移运算符(lt;lt;)int main(void){int a = 4;//把a的二进制位向左移动1位int b = a lt;lt; 1;printf("b = %d", b);return 0;}
在32-8位操作系统中,int类型占用4个字节,1个字节有8位,所以变量A在内存中占用32位。
将4赋给变量A,4的二进制形式存储在A中。
a将向左移动一位
0的最高位被丢弃,最后一位用0填充
可以看到,A左移一位的结果是1000,换算成十进制就是8,所以打印B的结果是8。
右移运算符(gt;gt;)int main(void){int a = 10;//把a的二进制位向右移动1位int b = a gt;gt; 1;printf("b = %d", b);return 0;}
将10赋给变量A,并将10表示为二进制形式
将10向右移动一位,并丢弃最低位的0
最高补码位是0
转换成十进制的最终结果是5
我们可以看到,打印B的最终结果确实是5。
这里需要注意的是,右移分为算术右移和逻辑右移
算术右移位:右丢弃,左补码符号位
逻辑右移位:右丢弃,左补码0
二进制序列存入内存时,最高位0表示正数,最高位1表示负数。
因为10是正数,所以不管是算术右移还是逻辑右移,最高位都用0填充。那么这里的右移运算是算术右移还是逻辑右移呢?
整数有三种二进制表示:原码、反码、补码
原码:直接按数值写的二进制序列
反码:原码的符号位不变,其他位逐位取反
补码:反码加1
计算机内存值的存储方式是补码。
int main(void){int a = -1;//把a的二进制位向右移动1位int b = a gt;gt; 1;printf("b = %d", b);return 0;}
以-1为例
-1的原始代码:
-1的倒数:
-1的补码:
因为补码存储在计算机中,所以将-1向右移动1位,并丢弃最低位1
我们先来看看B的打印结果
b的值为-1,表示最高补码为1。此时,执行算术右移。
需要注意的是,虽然A已经右移,但是A的值没有变化,我们也可以打印A。
int main(void){int a = 10;//把a的二进制位向右移动1位int b = a gt;gt; 1;printf("a = %d\n", a);printf("b = %d", b);return 0;}
A的结果还是10。
int a = 10;int b = a + 1;
它与上面的代码相同。当执行移位操作时,被移位对象的值不会改变。
这就是这篇关于C语言中移位操作符的文章。关于C语言中移位运算符的更多内容
精彩评论