news 2026/8/14 16:21:11

C语言基础:操作符详解(一)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言基础:操作符详解(一)

目录

一、操作符的分类

二、二进制和进制转换

但我们该怎么完成常用进制之间的进制转换呢?

如何完成十进制到二进制

​编辑如何完成二进制转到八进制

如何完成二进制转到十六进制

如何完成其他进制的转换

前言

C语言中提供了非常丰富的操作符

一、操作符的分类

一些简单的操作符比如:算术操作符,赋值操作符,关系操作符,逻辑操作符,相信大家都已了解,本文重点在于有关二进制的移位操作符和位操作符,还有部分单目操作符(sizeof,~

二、二进制和进制转换

因为本文要讲的移位操作符和位操作符,部分单目操作符(~,&)都用到了二进制的知识,所以我们先讲一个明白进制转换的问题:
常见的有二进制,八进制,十六进制

那我们生活中常见的十进制举例子:每一位上的数字范围是0~9,比9大之后需要在下一位进1,

所以我们可知二进制的数字范围是0~1,显而易见,八进制,十六进制就以此类推了。

依据权重将二进制转为十进制最为简单

但我们该怎么完成常用进制之间的进制转换呢?

如何完成十进制到二进制

一些比较小的数我们可以直接凑,但较大的数字在凑的话会很麻烦

所以我们可以用这种整除的方法(类似于小学学的求最大公约数)


如何完成二进制与八进制的互相转化

八进制的每位数是0~7,而二进制111对应的数就是7,所以每三个2进制的都可以对应为一个八进制,剩余不够的直接换算

还有一种说法就是2的三次方是8,二进制每一位的权重的三次方是对应八进制每一位的权重,所以三个二进制转换为一个八进制

二进制转换为八进制需要每三个数算,反之八进制将每位数拆成三个二进制

在八进制数字前面加上0,编译器会将其识别为八进制

如何完成二进制转十六进制的互相转化

十六进制的每一位数字则是0~9,a~f,将最大的数写成二进制,最多四位二进制就足够了。

所以一位十六进制就可以用四个二进制替换

16进制表示时前面加一个0x

如何完成其他进制的转换

我们学会了二进制所有的转换,十进制,八进制,十六进制之间转换,则需要换成二进制后转换

三、原码、反码、补码

整数二进制表示形式有三种:原码,反码,补码

整数分为:有符号整数,符号整数(正数,负数)

有符号整数的三种表示方法分为:符号位和数值位两个部分,最高的一位被当作符号位

“0”代表正,“1”代表负

正整数原码,反码,补码相同 负整数的原码,反码,补码不同

无符号整数原码,反码,补码相同

原码:直接将数值翻译成二进制的数字

反码: 将原码翻译对应的每一位二进制数字都按位取反

补码:反码加一得到补码

补码取反再加一也可得到原码(常用)跳过

对于整形数据来说,数据存储,计算,表示都是用的补码,因为补码可以将符号位和数值域统一处理,加法和减法统一处理(CPU有只有加法器),并且原码和补码的相互转换的过程是相同的,都是可以通过取反加一得到,因此不需要额外的电路

四、移位操作符

<< 左移操作符

>> 右移操作符

注:操作数只能是整数,移动的是二进制的位

1.左移操作符

#include<stdio.h> int main() { int a = -10; //1000000000000000000000001010 -10原码 //1111111111111111111111110101 反码 注意符号位不变 //1111111111111111111111110110 补码 int b = a << 1 ; //1111111111111111111111101100 b的补码 //1000000000000000000000010100 b的原码 左边抛弃,右边补0 printf("a = %d",a); // -10 printf("b = %d",b); // -20 左移相当于乘上2 return 0; }

2.右移操作符

(1)逻辑右移:左边用0补充,右边丢弃

(2)算术右移:左边与原符号位相同,右边抛弃

使用哪一种取决于编译器的实现,我们常用的编译器都是算术右移

int main() { int a = -10; //1000000000000000000000001010 -10原码 //1111111111111111111111110101 反码 注意符号位不变 //1111111111111111111111110110 补码 int b = a >> 1 ; //1111111111111111111111111011 b的补码 //1000000000000000000000000101 b的原码 左边与原符号位相同,右边补0 printf("a = %d",a); // -10 printf("b = %d",b); // -5 右移相当于除上2 return 0; }

五、位操作符

1.基础概念

1. & //按位与

2. | //按位或

3. ^ //按位异或

4. ~ //按位取反

int main() { int a = 10; //000000000000000000000001010 a的原,反,补 int b = -7; //100000000000000000000000111 //111111111111111111111111001 b的补码 int c = a & b;//只要有0则为0,同时为1则为1 //000000000000000000000001010 //111111111111111111111111001 //000000000000000000000001000 c的原,反,补码 printf("%d\n", c);//8 int d = a | b ;//有1则为1,同时为0则为0 //000000000000000000000001010 //111111111111111111111111001 //111111111111111111111111011 d的补码 //100000000000000000000000101 d的原码 printf("%d\n", d);//-5 int e = a ^ b; // 按位异或 x相同为0; 相异为1 }

4.按位取反

int main(){ int a = 0; //000000000000000000000000000000 0的补码 printf("%d" , ~a); //111111111111111111111111111111 按位取反 //100000000000000000000000000001 }

注:与原码到反码不同,符号位也需取反

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/14 16:20:28

中级开发者用 AI,最容易掉进的 5 个坑

文章目录开篇一、为什么中级开发者更容易踩坑二、这 5 个坑的共同问题是什么三、中级开发者最容易掉进的 5 个坑1. 需求只说一句话&#xff0c;就让 AI 直接写代码2. 不提供项目上下文&#xff0c;却期待 AI 写出可直接合并的代码3. 看到 AI 代码能运行&#xff0c;就跳过审查和…

作者头像 李华
网站建设 2026/8/14 16:11:50

从Cursor到多智能体:2026年AI全栈开发工具到底该怎么选?

以前说自己是全栈&#xff0c;意思是得懂点产品&#xff0c;能切图&#xff0c;前端Vue后端Node都能写&#xff0c;顺便还得懂点服务器部署。现在说全栈&#xff0c;我觉得更像是怎么调度不同脾气的AI。 过去这大半年&#xff0c;市面上叫得出名字的AI开发工具我都摸了一遍。很…

作者头像 李华
网站建设 2026/8/14 16:05:26

微信投票活动全攻略:从选工具到落地执行

在微信生态里发起一场投票活动&#xff0c;早已不是新鲜事。从班级评选优秀学员、部门评优、社区摄影比赛&#xff0c;到校园十佳歌手大赛、企业年度人物评选——几乎每一天&#xff0c;都有无数场投票活动在微信群里流转。但真正能把活动办得专业、公平、体面的&#xff0c;却…

作者头像 李华
网站建设 2026/8/14 16:03:34

maxGraph图表库实战:几分钟上手,从零构建可交互的流程图应用

maxGraph图表库实战&#xff1a;几分钟上手&#xff0c;从零构建可交互的流程图应用 【免费下载链接】maxGraph maxGraph is a fully client side JavaScript diagramming library 项目地址: https://gitcode.com/gh_mirrors/ma/maxGraph 还在为产品里要嵌入流程图编辑器…

作者头像 李华