操作符分类
首先我们来看一下C语言都有哪些操作符:
算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员
算术操作符
+ - * / %
C语言有以上五个算术操作符,对于加、减、乘没有什么要强调的,主要对除法和取余操作符补充一些知识点.
1.除了%操作符之外,其他操作符可以作用于整数和浮点数。
2.对于/操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
3.%操作符的两个操作数必须为整数。返回的是整除之后的余数。
下面举一些例子:
5%2.0//这种写法是错误的对于%操作符,两边必须都是整数,不能有浮点数。
5/2=2
5/2.0=2.5//若想要除法结果为小数,那么只需要让/操作符作用于一个浮点数或两个浮点数即可
移位操作符
<<左移操作符
>>右移操作符
PS:移位操作符的操作数只能是整数,并且移位操作符移的是二进制位。
我们平常生活中说的如15,20,10是十进制位,如果将他们改成二进制位结果如下:
1111//15
10100//20
1010//10
各个进制之间的转换在平常可能不常用,但大家一定要去了解一下,这对于后续学习,以及以后工作是有一定帮助的。
整型的2进制有三种表示方法:
原码、反码、补码。
反码就是和原码逐位比较,之后按位取反(符号位不变)如100的反码是001。
补码就是在反码的基础上加1如100的补码就是对001加1为011。
(二进制的运算后续学习到C语言存储时会细说,这里不在过多赘述)
正整数的原码、反码、补码相同
符号位是0,表示正数
符号位是1,表示负数
在C语言中整数类型是int,一个int占4个字节,每个字节是8位所以例如15在C语言中二进制表示方式如下:
//每一种方式都是32位数字,且正整数的原码,反码,补码是相同的。
00000000000000000000000000001111—原码//左起第一位即是符号位,因为15为正数所以第一位为0
00000000000000000000000000001111-反码
00000000000000000000000000001111-补码
如-15的二进制存储方式
10000000000000000000000000001111 —原码
11111111111111111111111111110000–反码(原码的符号位不变,其他位按位取反)
11111111111111111111111111110001-补码(反码+1)
PS:整数在内存中存储的是二进制的补码
移位操作符,移动的是存储在内存中的补码,但在输出时是按原码输出的。
具体我们来看以下叙述。
左移位操作符
移位规则:左面丢弃,右面补0。
如上图为num左移1位后的变化,我们来看一下代码示例:
#include <stdio.h>
int main()
{
int num = 10;
//00000000000000000000000000001010,补码
int a;
a = num << 1;
//00000000000000000000000000010100,补码
printf("%d %d", num, a);//输出时计算时按二进制原码来换算成十进制,然后进行输出
return 0;
}
这里可以看到num自身没有改变,移位后赋值给a,a为20。
#include <stdio.h>
int main()
{
int num = 10;
//00000000000000000000000000001010
int a;
num = num << 1;
//00000000000000000000000000010100
printf("%d", num);
return 0;
}
此时num的值会变化。
右移位操作符
右移操作符的移位规则分两种:
1.逻辑移位
左边用0填充,右边丢弃
2.算术移位
左边用原该值的符号位填充,右边丢弃
那么移位时到底遵循那种移位方法,C语言没有给出明确的规定,在当今绝大多数编译器遵循的是算术移位。
所以以下示例都将遵循算术移位:
#include <stdio.h>
int main()
{
int num = -4;
//10000000000000000000000000000100,原码
//11111111111111111111111111111011,反码
//11111111111111111111111111111100,补码
int a=num>>1;
//11111111111111111111111111111110,a的补码
printf("%d %d", num,a);
//10000000000000000000000000000010,输出时按照a原码来输出
return 0;
}
如上图补码转换成原码首先要减一位,之后在按位取反。
另外注意一点移位操作符移的位数必须大于等于1,如num>>-1这样是错误的,num>>1这样才是正确的。
位操作符
位操作符也是作用于二进制位,位操作符作用的也是二进制的补码。
& //按位与
| //按位或
^ //按位异或
注:他们的操作数必须是整数
&按位与是对两个整数的二进制位逐位比较,若一位为0那么得出的数这一位就为0,若两位都是1那么得出的数这一位才为1,具体我们来举例说明。
#include <stdio.h>
int main()
{
int num = -4;
//11111111111111111111111111111100,补码
int a=8;
//01111111111111111111111111111000,补码
num = a & num;
//01111111111111111111111111111000,按位与后num的补码
printf("%d %d", num,a);
//00000000000000000000000000001000,输出时按照num原码来输出
return 0;
}
| 按位或是对两个整数的二进制位逐位比较,若一位为1那么此位取1,若两位都是0那么此位取0,代码示例如下:
#include <stdio.h>
int main()
{
int num = -4;
//11111111111111111111111111111100,补码
int a=8;
//01111111111111111111111111111000,补码
a = a | num;
//11111111111111111111111111111100,按位或后a的补码
printf("%d %d", num,a);
//10000000000000000000000000000100,输出时按照a原码来输出
return 0;
}
^ 按位异或是对两个整数的二进制位逐位比较,当相应位上数字不相同时取1,相同时取0。代码示例如下:
#include <stdio.h>
int main()
{
int num = -4;
//11111111111111111111111111111100,补码
int a=8;
//01111111111111111111111111111000,补码
a = a ^ num;
//10000000000000000000000000000100,按位异或后a的补码
printf("%d %d", num,a);
//10000000000000000000000000001100,输出时按照a原码来输出
return 0;
}
尾记
笔者对C语言学习分为初阶和进阶,在初阶完成之后(大概在8.14左右)会和大家分享几篇以程序为主的博客,如三子棋等。
最后期待您的三连,若博客有错误的地方欢迎在私聊或在评论区指正。