右移操作符(包括)
算术移位
逻辑移位
先讲右移操作符
int main()
{
int a=7:
int b=a>>1:
printf(“a=%d\n”,a):
printf(“b=%d\n”,b):
return 0:
}
a的二进制是29个0加上三个1
想右移动以后这个1就没了 所以说左边那个补什么呢?0是正数 1是负数 图中a的位置放什么呢?
由此产生出了 两个移位算法
算术移位和逻辑移位
算术移位是右边丢弃 左边补原符号位
逻辑移位 右边丢弃 左边补0
所以代码变成30个0 两个一 最高位补0算术移位(vs支持的)右移动一位变成3
那么a的值是7,b的值理所应当是3
如何编译器是那种移位呢?
很简单 看代码
如果 这是算术移位 左边补1
如果是逻辑移位补0
注意重点 对于移位运算符,不要移动负数位置,这个是标准没定义的
2算术操作符
+ - */%
1除了%操作符之外 其他几个操作符可以作用于整数和浮点数
2对于/操作符如果两个操作数都为整数 执行整数除法 。而只有浮点数执行的就是浮点数除法。
3%操作符的良个操作数必须为整数 返回整除之后的余数
<<左移操作符>>右移操作符
注意移位操作符的操作数必须只能是整数
左移操作符
左边抛弃 右边补0
右移操作符
逻辑移位 左边用0填充 右边丢弃
算术移位 左边用原该值的符号位填充 右边丢弃。
警告对于移位运算符 不要移动负数位 这个是标准未定义的
位操作符
&//按位与
I//按位或
^//按位异或
这个位是指二进制位
注意他们的操作数必须是整数
看代码
结果是3 整数在内存存储的是二进制的补码
3的源码是30个0两个11 因为是正数 3的正码反码补码
负5的源码
反码补码
正数 反数存储的都是补码 按位与 如果两个结果都为0两个为0 如果两个为一同为一
3和负五都有所以结果为1
接着看代码
按位或运算 二进制如果进行按位或 运算 只要有1才为1 两个为0同时为0
相同为0相异为1