当前位置:网站首页>【c】操作符详解(一)
【c】操作符详解(一)
2022-08-02 21:02:00 【silence-Tan】
哈喽大家好,大家好 !
我是Mr.tan
今天呢,给大家分享一些c语言中的操作符号,希望对大家学习c语言能有所帮助。
一、算数运算符
| 操作符: | 描述: | 用法案例: | 结合性: |
| + | 加法 | a + b | R-L |
| - | 减法 | a - b | R-L |
| * | 乘法 | a * b | R-L |
| / | 除法 | a / b | R-L |
| % | 整数取余 | a % b | R-L |
对于加法、减法、乘法我想大家已经再熟悉不过了,所以我们直接看代码以及运行结果:
1、加法
int main()
{
int a = 10;
int b = 5;
int c = a + b;
printf("%d", c);
return 0;
}
2、减法
int main()
{
int a = 10;
int b = 5;
int c = a -b;
printf("%d\n", c);
return 0;
}
3、乘法
int main()
{
int a = 10;
int b = 5;
int c = a *b;
printf("%d\n", c);
return 0;
}
4、除法
当我们看到下面两个代码的运行结果,发现最后打印的都是2,为什么会出现这种情况呢?大家都知道在数学运算中“10/4=2.5”,但是你认为在数学中的运算结果与c语言编译器中的运行结果是一样的?那当然不是,当我们把两个变量都定义为int类型的时候,相除打印出来的也是一个整形数据。
//代码1
int main()
{
int a = 10;
int b = 5;
int c = a / b;
printf("%d\n", c);
return 0;
}

//代码2
int main()
{
int a = 10;
int b = 4;
int c = a / b;
printf("%d\n", c);
return 0;
}

当遇到这样的问题,很多人都想问,有没有一种办法能让在数学中的结果与c语言编译器打印出来的结果是一样的呢?答案是“有”,那么请看下面这段代码:
int main()
{
printf("%f\n", 10.0/4);
printf("%f\n", 10 / 4.0);
printf("%f\n", 10.0 / 4.0);
return 0;
}
int main()
{
double a = 10;
double b = 4;
printf("%f\n", a/b);
return 0;
}
从上面两个代码的运行结果中可以看出,当我们想得出与数学表达式结果一样的值时,我们有两种方法:
- 除法想得到小数的结果,必须保证除数与被除数中至少有一个是小数(浮点数);
- 当初始化变量时,将变量初始化为double类型或者float类型的数据
5、整数取余
对于整数取余运算,两个操作数必须为整数,当我们给它浮点型数据时,编译器会给我们报错。
int main()
{
5 % 2;
}

所以我们在对于整数取余操作时,要注意%两边应为整数,而整数取余的返回值为整除之后的余数。
int main()
{
printf("%d\n",5 % 2);
return 0;
}

![]()
二、移位操作符
在c中,移位运算符<<(左移)和>>(右移)。移位运算符组成的表达式也属于算术表达式,它的值为算术值。左移运算是将一个二进制位的操作数按给定的位数向左移动,移出位被丢弃,右边移出的空位一律补0。右移运算是将一个二进制位的操作数按给定的位数向右移动,移出位被丢弃,左边移出的空位一律补0,或者补符号位,正数的符号位为0,负数的符号位为1。
| 操作符 | 描述: | 用法案例: | 结合性 |
| << | 左移操作符 | num << 1 | L-R |
| >> | 右移操作符 | num >> 1 | L-R |
1、左移操作符
(1)、用法规则:按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
(2)、语法格式:需要移位的数字 << 移位的次数(例如:4 << 1,则是将数字4左移1位)。
(3)、计算过程:
首先把4转换为二进制数字00000000 00000000 00000000 00000100,然后把该数字高位(左侧)的零移出,其他的数字都朝左平移1位,最后在低位(右侧)的空位补零。则得到的最终结果是00000000 00000000 00000000 00001000,则转换为十进制是8。
int main()
{
int a = 4;
int b = a << 1;
printf("%d\n",b);
return 0;
}

以上为整数的左移操作,接下来同样给大家演示一遍负数的左移操作:
首先把-4转换为二进制数字10000000 00000000 00000000 00000100,然后将其二进制原码转换为反码11111111 11111111 11111111 11111011,再将其反码转换为补码11111111 11111111 11111111 11111100,数字高位(左侧)的一移出,其他的数字都朝左平移1位,最后在低位(右侧)的空位补零。则得到的为所求值的补码11111111 11111111 11111111 11111000,再将所求得补码减1求反码,反码为11111111 11111111 11111111 11110111,然后将反码转换为原码,最终结果是10000000 00000000 00000000 00001000,则转换为十进制是-8。
int main()
{
int a = -4;
int b = a << 1;
printf("%d\n",b);
return 0;
}
2、右移操作符
右移分为逻辑右移(右边丢弃,左边补0)和算术右移(右边丢弃,左边补符号位)。对于右移采用逻辑右移和算术右移,c语言没有给出明确的答案,具体取决于编译器,但是大部分编译器都用算术数右移,所以下面所举的案例都采用算术右移。
(1)、用法规则:按二进制形式把所有的数字向右移动对应位移位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。
(2)、语法格式:需要移位的数字 >> 移位的次数(例如:4 >> 1,则是将数字4右移1位)。
(3)、计算过程:
-4 >> 1
首先把-4转换为二进制数字10000000 00000000 00000000 00000100,然后将其二进制原码转换为反码11111111 11111111 11111111 11111011,再将其反码转换为补码11111111 11111111 11111111 11111100,数字低位(右侧)的一个零移出,其他的数字都朝右平移1位,最后在高位(左侧)的空位补1。则得到的为所求值的补码11111111 11111111 11111111 11111110,再将所求得补码减1求反码,反码为11111111 11111111 11111111 11111101,然后将反码转换为原码,最终结果是10000000 00000000 00000000 00000010,则转换为十进制是-2。
4 >> 1
首先把4转换为二进制数字00000000 00000000 00000000 00000100,然后把该数字低位(右侧)的零移出,其他的数字都朝右平移1位,最后在高位(左侧)的空位补符号位。则得到的最终结果是00000000 00000000 00000000 00000010,则转换为十进制是2。

int main()
{
int a = -4;
int b = a >> 1;
printf("b = %d\n",b);
int c = 4;
int d = c >> 1;
printf("d = %d\n",d);
return 0;
}

三、位操作符
| 操作符: | 描述: | 用法案例: | 结合性: |
| & | 按位与 | num & num | L-R |
| | | 按位或 | num | num | L-R |
| ^ | 按位异或 | num ^ num | L-R |
1、按位与
只有对应的两个二进制位都为1时,结果位才为1,否则结果为0。
3 & -5
3的二进制补码为00000000 00000000 00000000 00000011,-5的二进制补码为11111111 11111111 11111111 11111011,两数的二进制补码进行按位与操作,所得结果为00000000 00000000 00000000 00000011,将其转化为十进制数为3。
2、按位或
只有对应的两个二进制位都为0时,结果位才为0,否则结果为1。
3 | -5
3的二进制补码为00000000 00000000 00000000 00000011,-5的二进制补码为11111111 11111111 11111111 11111011,两数的二进制补码进行按位或操作,所得结果为11111111 11111111 11111111 11111011,将其补码化为原码的形式,然后转化为十进制数的时候为-5。
3、按位异或
只有对应位置的二进制为的两个数相同时为0,相反则为1。
3 ^ -5
3的二进制补码为00000000 00000000 00000000 00000011,-5的二进制补码为11111111 11111111 11111111 11111011,两数的二进制补码进行按位异或操作,所得结果为11111111 11111111 11111111 11111000,将其补码化为原码的形式,然后转化为十进制数的时候为-8。
int main()
{
int a = 3;
int b = -5;
int c = a & b;//按位与
int d = a | b;//按位或
int e = a ^ b;//按位异或
printf("c = %d\n",c);
printf("d = %d\n", d);
printf("e = %d\n", e);
return 0;
}
总结:
1、整数的原码、反码与补码相同;负数的反码:符号位不变,其余取反;负数的补码:补码加1所得到的就是负数的补码;
2、整数在内存中是以二进制补码的形式存储的;
3、“<<”、“>>”移位操作符,移动的是存储在内存中的补码;
4、按位与、按位或、按位异或操作的数必须都为整数。
欢迎大家的收看,今天的内容到此结束了,让我们一起期待下一篇文章的到来吧!!!
如果喜欢,那就一键三连吧!!!
边栏推荐
- Nervegrowold hands-on learning deep learning V2 - Bert pre training data set and code implementation
- 主成分分析(PCA)
- golang刷letcode:公司命名
- @Transactional 事务调用与生效场景总结
- js: 实现一个cached缓存函数计算结果
- How the sensor works
- 包管理工具npm- node package management相关知识 、检查包更新、NPM包上传、更换镜像、npm ERR! registry error parsing json
- golang刷leetcode:最大波动的子字符串
- 正则表达式
- go——垃圾回收机制(GC)
猜你喜欢
随机推荐
Use the TCP protocol, we won't lost package?
golang 刷leetcode:从栈中取出 K 个硬币的最大面值和
总结嵌入式C语言难点(2部分)
并发与并行
A brief discussion on the transformation of .NET legacy applications
模糊查询like用法实例(Bee)
go——内存分配机制
js how to get the browser zoom ratio
JumpServer开源堡垒机完成龙芯架构兼容性认证
Zabbix 5.0 Monitoring Tutorial (2)
Day12 接口和协议
vscode如何能将输出从OUTPUT改为TERMINAL或者DebugConsole
快速学会ansible的安装
拥抱Cmake小朋友 简单又实用,但是不灵活
PLC working principle animation
golang刷leetcode:拼接数组的最大分数
ECCV 2022 | ByteTrack: 简单高效的数据关联方法
The software testing process specification is what?Specific what to do?
golang刷letcode:公司命名
JMeter的基本使用



![[C题目]力扣142. 环形链表 II](/img/b0/1e92f0f178089fc12cf88072d28912.png)




