操作符分类:
算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员
算术操作符
+ - * / %
1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
移位操作符
<< 左移操作符
>> 右移操作符
注:移位操作符的操作数只能是整数。
原码
计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数 该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。
反码
正数的反码是它本身,负数的反码是符号位不变,其它位取反
补码
整数的补码是它本身,负数的补码是反码+1,整数是以补码的形式进行存储的
左移操作符
此时a的数值并未发生变化。而是把操作完的数字赋值给了b
用负数进行左移
总结:左移操作符,左边丢弃,右边补0
右移操作符
对a右移一位之后,我们发现此时符号位的位置空缺了一位,此时应该补0或者1
算数位移:左边丢弃,右边补原符号位
逻辑位移:左边丢弃,右边补0
我们用负数测试后,发现vs2019用的是算术位移, 因为逻辑位移只补0,补0之后就是正数了,大多数编译器用的都是算术位移,
错误写法
位操作符
&//按位与
|//按位或
^//按位异或
注:他们的操作数必须是整数。
负数运算也是如此,按位与&:有0则结果为0
按位或| :有1则结果为
按位异或^:不同则为1
运算法则:补码相运算,然后把补码根据原码反码补码的关系,转为原码,则最终得到的数字就是原码所代表的数字,只不过是以补码的形式进行存储
不能创建临时变量(第三个变量),实现两个数的交换
#include<stdio.h> int main() { int a = 3; int b = 5; printf("交换前:%d %d", a, b); a = a + b; b = a - b; a = a - b; printf("交换后:%d %d", a, b); return 0; }
#include<stdio.h> int main() { int a = 3; int b = 5; printf("交换前:%d %d", a, b); a = a ^ b; b = a ^b; a = a ^b; printf("交换后:%d %d", a, b); return 0; }
#include<stdio.h> int main() { int a = 3; int b = 5; a = 3^ 3; b = 3 ^0; printf("%d %d", a, b); return 0; }
任何数和0异或都为任何数,任何数和它本身异或都为0
异或支持交换律