C语言操作符详解(1)

操作符分类

首先我们来看一下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左右)会和大家分享几篇以程序为主的博客,如三子棋等。
最后期待您的三连,若博客有错误的地方欢迎在私聊或在评论区指正。

  • 27
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值