【C语言】操作符详解(上)

C语言操作符详解 C语言操作符详解,位运算,运算符,sizeof和数组,访问结构体成员 阅读详情
请添加图片描述
主页链接: LSR的主页
专栏链接: 《C语言》


前言

今天分享关于操作符的基础知识,一起来学习一下吧。


一、操作符的分类

算术操作符: + 、- 、*、/ 、%
• 移位操作符: << >>
• 位操作符: & 、 | 、 ^
• 赋值操作符: = 、+= 、 -= 、 = 、 /= 、%= 、<<= 、>>= 、&= 、|= 、^=
• 单目操作符: !、++、–、&、
、+、-、~ 、sizeof、(类型)
• 关系操作符: > 、>= 、< 、<= 、 == 、 !=
• 逻辑操作符: && 、||
• 条件操作符: ? :
• 逗号表达式: ,
• 下标引用: []
• 函数调用: ()
• 结构成员访问: . 、->


二、二进制和进制转换

二进制其实和十进制的满10进1同理,为满2进1,每一位由0或1表示。
八进制和十六进制同理。
15的2进制:1111
15的8进制:17
15的10进制:15
15的16进制:F
值得一提的是,十六进制大于10时,按A~F依次代替表示。
在这里插入图片描述


1.二进制转十进制

以125为例:
在这里插入图片描述

2.二进制转八进制和十六进制

2.1二进制转八进制

从2进制序列中右边低位开始向左每3个2进制位会换算⼀个8进制位,剩余不够3个2进制位的直接换算。
如:2进制的01101011,换成8进制:0153,0开头的数字,会被当做8进制。

2.2二进制转十六进制

2进制转16进制数的时候,从2进制序列中右边低位开始向左每4个2进
制位会换算⼀个16进制位,剩余不够4个⼆进制位的直接换算。
如:2进制的01101011,换成16进制:0x6b,16进制表示的时候前⾯加0x。


三、原码、反码、补码

整数的2进制表示方法有三种,即原码、反码和补码
有符号整数的三种表示方法均有符号位和数值位两部分,2进制序列中,最⾼位的1位是被当做符号位,剩余的都是数值位。
符号位都是用0表示“正”,⽤1表示“负”。
正整数的原、反、补码都相同。
负整数的三种表示方法各不相同。
原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。
补码得到原码也是可以使用:取反,+1的操作。

注意:对于整形来说,数据存放内存中其实存放的是补码,所以内存中的计算都是以补码的形式计算的。
原因如下:
使用补码,可以将符号位和数值域统⼀处理;同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。


四、移位操作符

**<<** 左移操作符
**>>** 右移操作符

注:移位操作符的操作数只能是整数。


1.左移操作符

移位规则:左边丢弃,右边补0

#include <stdio.h>
int main()
{
 int num = 10;
 int n = num<<1;
 printf("n= %d\n", n);
 printf("num= %d\n", num);
 return 0;
}

在这里插入图片描述

2.右移操作符

移位规则:
逻辑右移:右边丢弃,左边补0
算数右移:右边丢弃,左边用该值符号位填充(大部分运算为算数右移)

#include <stdio.h>
int main()
{
 int num = 10;
 int n = num>>1;
 printf("n= %d\n", n);
 printf("num= %d\n", num);
 return 0;
}

在这里插入图片描述

逻辑右移


在这里插入图片描述
算数右移


对于移位运算,不要移动负数位,标准未定义。

int num = 10;
num>>-1;//error

五、位操作符: & 、 | 、 ^ 、~

& —— 按位与
| ——按位或
^——按位异或
~——取反

注:他们的操作数必须是整数。

#include <stdio.h>
int main()
{
 int num1 = -3;
 int num2 = 5;
 printf("%d\n", num1 & num2);
 printf("%d\n", num1 | num2);
 printf("%d\n", num1 ^ num2);
 printf("%d\n", ~0);
 return 0;
}

举个例子:
在不创建第三个变量的前提下,实现两个数的交换。
你可能会想到:

#include <stdio.h>
int main()
{
 int a = 2;
 int b = 3;
 a = a + b;
 b = a - b;
 a = a - b;
 printf("%d %d\n", a, b);
 return 0;
}

但是有一个问题,如果 a 和 b 很大, a+b的值超出了整型的范围,那么这个值就失效了。
所以这里引入使用异或(^)的方式,代码如下:

#include <stdio.h>
int main()
{
 int a = 10;
 int b = 20;
 a = a^b;
 b = a^b;
 a = a^b;
 printf("a = %d b = %d\n", a, b);
 return 0;
}

这里要引入 0 ^ n = n,n ^ n = 0,这里用补码看就很清晰了,二进制位0 ^ 0 出0;0 ^ 1出1
所以a ^ b 的值赋给a,进入下一个表达式,a用这个值替换,根据结合律,b ^ b = 0,
0 ^ a = a,同理下一个表达式也是如此。
这个初学可能想不到,如果不好理解,可以把a^b的值看作一把钥匙,遇到b就可以打开a,将a值赋给b,遇到a就可以打开b,将b值赋给a。


这里再给两个练习,大家自行参考:
例1、编写代码实现:求⼀个整数存储在内存中的⼆进制中1的个数。

#include <stdio.h>
int main()
{
 int num = -1;
 int i = 0;
 int count = 0;//计数
 while(num)
 {
 count++;
 num = num&(num-1);
 }
 printf("⼆进制中1的个数 = %d\n",count);
 return 0;
}

在这里插入图片描述


例2、编写代码将13⼆进制序列的第5位修改为1,然后再改回0
13的2进制序列: 00000000000000000000000000001101
将第5位置为1后:00000000000000000000000000011101
将第5位再置为0:00000000000000000000000000001101

#include <stdio.h>
int main()
{
 int a = 13;
 a = a | (1<<4);
 printf("a = %d\n", a);
 a = a & ~(1<<4);
 printf("a = %d\n", a);
 return 0;
}

总结

本文介绍了C语言中操作符的基础知识,包括操作符分类、进制转换、原码/反码/补码、移位操作符和位操作符。重点讲解了二进制与十进制转换方法,整数在内存中以补码形式存储的原因,以及左移、右移操作符的使用规则。通过实际代码示例演示了位操作符(&、|、^、~)的应用,包括不借助临时变量交换两个数的技巧。最后提供了两个练习题目:统计二进制中1的个数和修改特定位的值。
希望对你有所帮助。

Android图形系统(三)系统篇:渲染/合成的底层原理浅析 众所周知,渲染工作是由GPU负责,那么在聊GPU之前首先得知道什么是“渲染”?我们来举个例子感受一下在系统中申请一块10*101、把图层背景这玩意染成绿的2、从左上(0,0)到右下(10,10)画一条宽度为1颜色为红色的直线3、以坐标点(5,5)为中心,画一个半径为3的实心圆,颜色要蓝色好了,接下来操作系统会把这些“绘图指令”同步给GPU去执行渲染任务图片来源:自己画的GPU完成渲染工作后,我们将会得到一个大小为10*10二维数组,数组中的每个元素都保存着坐标点的颜色信息、深度信息。 阅读详情

相关推荐

基于STM32与SimpleFOC实现直流无刷电机开环控制的实战指南

本文提供了一份基于STM32微控制器与SimpleFOC开源库实现直流无刷电机开环控制的详细实战指南。内容涵盖硬件连接、PlatformIO环境搭建、核心代码解析及上电测试,旨在帮助开发者快速验证硬件并理解开环控制的基本原理,为后续实现高性能的闭环FOC控制奠定基础。

xxx12的博客 961

【C语言】操作符详解

【C语言】操作符详解

XJ2536877903的博客 1504

关于mos管的压降问题(项目遇到问题总结)

在研发过程中没有出现问题的板子,到了小批时竟出现雷达一直在触发???找了大几天,没有头绪。心中疑惑颇多,加上老板催促,自考等原因,真是压力山大。4月份自考,只有差不多一个月时间了吧,没有什么大的收获,反而在查找硬件问题的过程中,发现了一个自己忽视的一个问题,就是关于Mos管的压降问题。 备考的过程崎岖不平,工作又问题多多,孰轻孰重,如何取舍?从心理来说,不想取舍什么,只是有所得就可以,过不了就过不了呗,已经毕业十五年了,没这个本科文凭不也过来了吗?只是代表了自己在这一段时间的思考,自己兴趣吧,没什么大不了

guangod的博客 2万+

【C语言】操作符详解(下)

文章摘要: 本文是C语言操作符讲解的续集,主要介绍单目操作符、逗号表达式及结构体相关操作,希望可以帮助到你。

LSRISME的博客 1404

IIS - 会话cookie中缺少HttpOnly属性

不啰嗦,我们直接开始! 先进行常规设置 打开配置编辑器 选中图中节点,将httpOnlyCookies设置为true 然后。。。不起作用。。。 换种方式 通过配置出站规则getcookie添加HttpOnly 在Web.config中添加如下出站规则 <rewrite> <outboundRules> <rule name="Add HttpOnly"> <match serverVa.

。 21万+

大疆RoboMaster嵌入式面试,电机FOC调不出来当场走人

摘要:大疆RoboMaster嵌入式工程师面试以实战能力著称,重点考察FreeRTOS任务调度、FOC电机控制和CAN总线三大核心技能。FreeRTOS部分涉及优先级调度、栈溢出排查及信号量与互斥锁的区别;FOC控制要求现场编写电流环代码,并解释Clarke/Park变换原理;CAN总线则关注仲裁机制、CANopen协议应用及错误帧排查方法。面试强调工程实践,需具备STM32开发经验,建议搭建实际环境进行练习。该岗位被誉为"硬件版修罗场",充分体现大疆对实际开发能力的严格要求。

郑伟强dev的专栏 150

C语言——操作符详解

目录 操作符分类: 1、算术操作符 2、位操作符 3、赋值操作符 4、单目操作符 5、关系操作符 6、逻辑操作符 7、条件操作符 8、逗号操作符 9、下标引用、函数调用和结构成员 1、算术操作符 + - * / % % 是取模操作符,意思就是 求余数。 int ret = 10 % 3; //求10 % 3的余数,得出的余数是1 printf("%d\n", ret); 注意的是:% .........

weixin_57525369的博客 7554

哨兵1号回波数据(L0级)包格式解析与成像参数提取

提取哨兵1号数据包的辅助数据、回波数据、定标数据。matlab代码在文末

3127

C语言:操作符详解

C语言中,为了方便计算,提供了一系列操作符,让我们一起去学习吧!!本文总结了所有操作符的易错点!

weixin_51142926的博客 1万+

外骨骼机器人(二):自适应振荡器

振荡器是一种数学工具,可以用于实时跟踪、预测类周期信号的频率、相位、幅值等,而助行外骨骼机器人需要自动适应人体的行走频率、幅度,两者相结合,就能使助行外骨骼机器人拥有更舒适、更自然的行走步态。 ......

行者无疆的博客 4264

【七.三维视觉与视频分析】【1.点云处理:PointNet++/PointTransformer】

各位老铁,今天咱们要聊的可不是普通的二维图像处理,而是三维视觉领域最硬核的技术——点云处理。从最早的PointNet到如今的PointTransformer,这场技术进化堪比三维版的"像素革命"。今天咱们就深入解剖两大里程碑:PointNet++和PointTransformer,保证让你看完全文就能在点云领域横着走!想象一下,你抓了把沙子撒在空中,每粒沙子的位置都是三维坐标——这就是点云的典型形态。最后送大家一句话:点云处理就像在三维宇宙中寻找星辰的轨迹,既要望远镜的宏观视野,也要显微镜的细致入微。

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 474

C语言操作符——详解

这么快与大家又见面了,今天给大家推出一期关于操作符相关的作品,希望能够带大家真正大了解操作符中的坑和小技巧😎😎😎 文章目录一、操作符的分类二、算术操作符三、移位操作符四、位操作符1、小试牛刀2、练习题13、练习题24、练习题3五、赋值操作符 一、操作符的分类 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用、函数调用和结构成员 二、算术操作符 + - * / % 相信大家对+,-,*没有什么疑问,那么就针对/

buhuisuanfa的博客 3004

注意力机制篇 | YOLOv8改进之在C2f模块添加EMA注意力机制(附2种改进方法)

EMA(Exponential Moving Average)注意力机制是一种用于增强模型性能的注意力机制,它通过对模型的特征图进行加权平均来提取更有用的特征信息。具体来说,EMA注意力机制通过引入一个权重因子来调整特征图中每个位置的重要性,从而使模型能够更好地关注重要的特征。🌈

小哥谈 4180

详解操作符【C语言】

操作符详解【C语言】

Man9o 3476

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【c 语言】算术操作符详解

本博客将详细解析C语言中的各类算术操作符,包括加法、减法、乘法、除法、取模以及增量与减量操作符,通过示例与解释帮助读者深入理解其用法,同时提醒注意事项,避免在实际编程中踩坑。通过掌握这些操作符的使用技巧,您将能够编写出更加高效、准确的C语言代码。

m0_74195174的博客 2311

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

操作符详解—c语言

目录1. 操作符分类:2. 算术操作符3. 移位操作符 3.1 左移操作符3.2 右移操作符4. 位操作符 5. 赋值操作符 6. 单目操作符6.1 单目操作符介绍 7. 关系操作符8. 逻辑操作符 9. 条件操作符 10. 逗号表达式 11. 下标引用、函数调用和结构成员 12. 表达式求值 12.1 隐式类型转换 12.2 算术转换 12.3 操作符的属性 2. 算术操作符 1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。 2. 对于 / 操作符如果两个操作数都为整数,

m0_63562631的博客 3230
上一篇: 【C语言】函数递归思想
下一篇: 【C语言】递归实战——青蛙跳台(从基础到进阶)
尘诞辰
博客等级 码龄2年 114粉丝 12原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值