• C语言操作符详解(1)


    操作符分类

    首先我们来看一下C语言都有哪些操作符:
    算术操作符
    移位操作符
    位操作符
    赋值操作符
    单目操作符
    关系操作符
    逻辑操作符
    条件操作符
    逗号表达式
    下标引用、函数调用和结构成员

    算术操作符

    + - * / %
    
    • 1

    C语言有以上五个算术操作符,对于加、减、乘没有什么要强调的,主要对除法和取余操作符补充一些知识点.
    1.除了%操作符之外,其他操作符可以作用于整数和浮点数。
    2.对于/操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
    3.%操作符的两个操作数必须为整数。返回的是整除之后的余数。
    下面举一些例子:

    5%2.0//这种写法是错误的对于%操作符,两边必须都是整数,不能有浮点数。
    5/2=2
    5/2.0=2.5//若想要除法结果为小数,那么只需要让/操作符作用于一个浮点数或两个浮点数即可
    
    • 1
    • 2
    • 3

    移位操作符

    <<左移操作符
    >>右移操作符
    
    • 1
    • 2

    PS:移位操作符的操作数只能是整数,并且移位操作符移的是二进制位。
    我们平常生活中说的如15,20,10是十进制位,如果将他们改成二进制位结果如下:

    1111//15
    10100//20
    1010//10
    
    • 1
    • 2
    • 3

    各个进制之间的转换在平常可能不常用,但大家一定要去了解一下,这对于后续学习,以及以后工作是有一定帮助的。
    整型的2进制有三种表示方法:
    原码、反码、补码。
    反码就是和原码逐位比较,之后按位取反(符号位不变)如100的反码是001。
    补码就是在反码的基础上加1如100的补码就是对001加1为011。
    (二进制的运算后续学习到C语言存储时会细说,这里不在过多赘述)
    正整数的原码、反码、补码相同
    符号位是0,表示正数
    符号位是1,表示负数
    在C语言中整数类型是int,一个int占4个字节,每个字节是8位所以例如15在C语言中二进制表示方式如下:

    //每一种方式都是32位数字,且正整数的原码,反码,补码是相同的。
    00000000000000000000000000001111—原码//左起第一位即是符号位,因为15为正数所以第一位为0
    00000000000000000000000000001111-反码
    00000000000000000000000000001111-补码
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    如-15的二进制存储方式

    10000000000000000000000000001111 —原码
    11111111111111111111111111110000–反码(原码的符号位不变,其他位按位取反)
    11111111111111111111111111110001-补码(反码+1)
    
    
    • 1
    • 2
    • 3
    • 4

    PS:整数在内存中存储的是二进制的补码
    移位操作符,移动的是存储在内存中的补码,但在输出时是按原码输出的。
    具体我们来看以下叙述。

    左移位操作符

    移位规则:左面丢弃,右面补0。
    在这里插入图片描述
    如上图为num左移1位后的变化,我们来看一下代码示例:

    #include 
    int main()
    {
    	int num = 10;
    	//00000000000000000000000000001010,补码
    	int a;
    	a = num << 1;
    	//00000000000000000000000000010100,补码
    	printf("%d %d", num, a);//输出时计算时按二进制原码来换算成十进制,然后进行输出
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述
    这里可以看到num自身没有改变,移位后赋值给a,a为20。

    #include 
    int main()
    {
    	int num = 10;
    	//00000000000000000000000000001010
    	int a;
    	num = num << 1;
    	//00000000000000000000000000010100
    	printf("%d", num);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述
    此时num的值会变化。

    右移位操作符

    右移操作符的移位规则分两种:
    1.逻辑移位
    左边用0填充,右边丢弃
    2.算术移位
    左边用原该值的符号位填充,右边丢弃
    那么移位时到底遵循那种移位方法,C语言没有给出明确的规定,在当今绝大多数编译器遵循的是算术移位。
    所以以下示例都将遵循算术移位:

    #include 
    int main()
    {
    	int num = -4;
    	//10000000000000000000000000000100,原码
    	//11111111111111111111111111111011,反码
    	//11111111111111111111111111111100,补码
    	int a=num>>1;
    	//11111111111111111111111111111110,a的补码
    	printf("%d %d", num,a);
    	//10000000000000000000000000000010,输出时按照a原码来输出
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    如上图补码转换成原码首先要减一位,之后在按位取反。
    在这里插入图片描述
    另外注意一点移位操作符移的位数必须大于等于1,如num>>-1这样是错误的,num>>1这样才是正确的。

    位操作符

    位操作符也是作用于二进制位,位操作符作用的也是二进制的补码。

    & //按位与
    | //按位或
    ^ //按位异或
    注:他们的操作数必须是整数
    
    • 1
    • 2
    • 3
    • 4

    &按位与是对两个整数的二进制位逐位比较,若一位为0那么得出的数这一位就为0,若两位都是1那么得出的数这一位才为1,具体我们来举例说明。

    #include 
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述
    | 按位或是对两个整数的二进制位逐位比较,若一位为1那么此位取1,若两位都是0那么此位取0,代码示例如下:

    #include 
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述
    ^ 按位异或是对两个整数的二进制位逐位比较,当相应位上数字不相同时取1,相同时取0。代码示例如下:

    #include 
    int main()
    {
    	int num = -4;
    	//11111111111111111111111111111100,补码
    	int a=8;
    	//01111111111111111111111111111000,补码
    	a = a ^ num;
    	//10000000000000000000000000000100,按位异或后a的补码
    	printf("%d %d", num,a);
    	//10000000000000000000000000001100,输出时按照a原码来输出
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    尾记

    笔者对C语言学习分为初阶和进阶,在初阶完成之后(大概在8.14左右)会和大家分享几篇以程序为主的博客,如三子棋等。
    最后期待您的三连,若博客有错误的地方欢迎在私聊或在评论区指正。

  • 相关阅读:
    【Windows】windows7/10/11通用,开放防火墙入站、出站端口配置
    JVM(3)
    【滤波器】基于遗传算法优化FIR滤波器设计附matlab代码
    MybatisPlus分页插件使用
    Java中浅拷贝和深拷贝
    Redis系列之客户端Redisson
    SpringMVC 02
    Android 网络动态监听和是否联网
    1.什么是软件工程?它目标和内容是什么?2.软件开发中有哪几种过程模型?哪些适用于面向对象的软件开发?
    dubbo命令行
  • 原文地址:https://blog.csdn.net/lzmyyds/article/details/126057084