当前位置: 首页 > news >正文

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 }

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

http://www.cnnetsun.cn/news/4025727.html

相关文章:

  • 中级开发者用 AI,最容易掉进的 5 个坑
  • 从Cursor到多智能体:2026年AI全栈开发工具到底该怎么选?
  • 误删、格式化、硬盘罢工之后:TestDisk与PhotoRec免费数据恢复工具完整自救手册
  • 微信投票活动全攻略:从选工具到落地执行
  • maxGraph图表库实战:几分钟上手,从零构建可交互的流程图应用
  • WebPShop 插件完整使用指南:Photoshop 导出 WebP 与制作动画的免费教程
  • 从技术骨干到管理者,最大的转变不是能力,是角色和逻辑
  • 技术解析|音频分割在哪里切才不爆音?过零点与淡入淡出的四个关键细节
  • Windows 10/11 窗口毛玻璃特效实操指南:效果怎么选、怎么落地一次讲透
  • G-Helper完整上手指南:10分钟掌握华硕笔记本的功耗、风扇与显卡控制
  • 算法(23):heapsort-8.3一种先构建再排序的排序方法
  • 测试开发学习中。。。。
  • 基于linux上的终端贪吃蛇
  • 【论文翻译】SCNET: SPARSE COMPRESSION NETWORK FOR MUSIC SOURCE SEPARATION
  • 华硕笔记本控制工具G-Helper打不开?完整启动排查手册:5招让双击重新有反应
  • Socket编程:客户端与服务器通信全解析(网络编程)
  • 如何为Cocos Creator +微信小游戏项目建立一套可长期执行的性能治理体系?
  • SAP Task Gateway 扩展实战,如何为统一任务入口增加新的 Provider
  • Win11Debloat实测:半小时卸载预装软件、关闭遥测,新电脑终于不卡了
  • 性能优化:连接池、缓存、批量处理
  • 开源的报文分析平台:12 个规则库全接引擎,附在线体验
  • 从一句主题到一支成片:Pixelle-Video 零门槛全自动短视频引擎
  • Prompts原语:标准化提示词模板
  • 正则分组/php5版本下preg_replace /e模式下的代码执行
  • Kimi LeetCode 3906. 统计网格路径中好整数的数目 Rust实现
  • maxGraph零基础入门:纯客户端JavaScript图表库,零成本5分钟画出可交互流程图
  • Portainer:Docker可视化Web管理面板的新手首选方案
  • 华硕笔记本控制权争夺战:G-Helper一天上手,性能、散热与续航全面解放
  • Dism++完整上手指南:免费清理系统垃圾、修复更新失败的终极优化工具,5分钟就能见效
  • 【Proteus仿真设计】基于stm32单片机的智能家居系统设计