C语言基础:操作符详解(一) 目录一、操作符的分类二、二进制和进制转换但我们该怎么完成常用进制之间的进制转换呢如何完成十进制到二进制​编辑如何完成二进制转到八进制如何完成二进制转到十六进制如何完成其他进制的转换前言C语言中提供了非常丰富的操作符一、操作符的分类一些简单的操作符比如算术操作符赋值操作符关系操作符逻辑操作符相信大家都已了解本文重点在于有关二进制的移位操作符和位操作符还有部分单目操作符sizeof~二、二进制和进制转换因为本文要讲的移位操作符和位操作符部分单目操作符~都用到了二进制的知识所以我们先讲一个明白进制转换的问题常见的有二进制八进制十六进制那我们生活中常见的十进制举例子每一位上的数字范围是0~9比9大之后需要在下一位进1所以我们可知二进制的数字范围是0~1显而易见八进制十六进制就以此类推了。依据权重将二进制转为十进制最为简单但我们该怎么完成常用进制之间的进制转换呢如何完成十进制到二进制一些比较小的数我们可以直接凑但较大的数字在凑的话会很麻烦所以我们可以用这种整除的方法类似于小学学的求最大公约数如何完成二进制与八进制的互相转化八进制的每位数是0~7而二进制111对应的数就是7所以每三个2进制的都可以对应为一个八进制剩余不够的直接换算还有一种说法就是2的三次方是8二进制每一位的权重的三次方是对应八进制每一位的权重所以三个二进制转换为一个八进制二进制转换为八进制需要每三个数算反之八进制将每位数拆成三个二进制在八进制数字前面加上0编译器会将其识别为八进制如何完成二进制转十六进制的互相转化十六进制的每一位数字则是0~9a~f将最大的数写成二进制最多四位二进制就足够了。所以一位十六进制就可以用四个二进制替换16进制表示时前面加一个0x如何完成其他进制的转换我们学会了二进制所有的转换十进制八进制十六进制之间转换则需要换成二进制后转换三、原码、反码、补码整数二进制表示形式有三种原码反码补码整数分为有符号整数无符号整数正数负数有符号整数的三种表示方法分为符号位和数值位两个部分最高的一位被当作符号位“0”代表正“1”代表负正整数原码反码补码相同 负整数的原码反码补码不同无符号整数原码反码补码相同原码直接将数值翻译成二进制的数字反码: 将原码翻译对应的每一位二进制数字都按位取反补码反码加一得到补码补码取反再加一也可得到原码常用跳过对于整形数据来说数据存储计算表示都是用的补码因为补码可以将符号位和数值域统一处理加法和减法统一处理CPU有只有加法器并且原码和补码的相互转换的过程是相同的都是可以通过取反加一得到因此不需要额外的电路四、移位操作符 左移操作符 右移操作符注操作数只能是整数移动的是二进制的位1.左移操作符#includestdio.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 }注与原码到反码不同符号位也需取反

相关新闻

最新新闻

2025新版华为光猫刷机工具包|含中兴光猫辅助工具+HN8145XR/K662D固件及Shell补全文件

2025新版华为光猫刷机工具包|含中兴光猫辅助工具+HN8145XR/K662D固件及Shell补全文件

温馨提示:文末有联系方式 2025年度升级版华为光猫刷机工具正式发布 全新整合2025最新版华为光猫专用刷机工具包,全面适配主流华为终端设备,功能稳定、界面优化,专为技术人员及高级用户定制开发。 中兴光猫工具无缝兼容华为刷机需…

2026/8/14 17:11:37
GitHub上4个爆款AI开源Skill:拍照后不用P图,用Codex一键生成高级海报(附效果图+使用教程)

GitHub上4个爆款AI开源Skill:拍照后不用P图,用Codex一键生成高级海报(附效果图+使用教程)

你手机里有多少张"拍了但不知道能干嘛"的照片? 雨后地上的水洼倒影、咖啡店里随手拍的一角、旅行时抢拍的路牌——这些照片说不上惊艳,但扔掉又可惜。 最近 GitHub 上冒出了几个专门干这件事的开源项目:用 AI 把你的照片变成有设…

2026/8/14 17:11:37
Flutter 动画卡顿:DevTools 找阶段,组件边界解问题

Flutter 动画卡顿:DevTools 找阶段,组件边界解问题

Flutter 动画卡顿:DevTools 找阶段,组件边界解问题 列表缩放动画卡顿,问题常常不在曲线公式,而在状态更新范围。每一帧都触发页面级 setState,无关 Widget 也会跟着 build,到了真机上就更明显。 DevTools 用…

2026/8/14 17:11:37
百度网盘批量转存速成指南:上百个链接,一次粘贴全部入库

百度网盘批量转存速成指南:上百个链接,一次粘贴全部入库

百度网盘批量转存速成指南:上百个链接,一次粘贴全部入库 【免费下载链接】BaiduPanFilesTransfers 百度网盘批量转存、分享和检测工具 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduPanFilesTransfers 晚上十一点,你终于整理完了…

2026/8/14 17:11:37
保姆级SOME/IP服务发现SD实战:从FindService到SubscribeEventGroup(含Wireshark抓包+Vector CANoe配置)

保姆级SOME/IP服务发现SD实战:从FindService到SubscribeEventGroup(含Wireshark抓包+Vector CANoe配置)

“原理看懂了,但实际项目里SD报文长什么样?怎么用Wireshark抓?CANoe里怎么配?”这篇文章就是回答这些问题的。我们用一个完整的域控制器项目场景,从零开始: 用Wireshark抓真实的SOME/IP-SD报文逐字节解析Of…

2026/8/14 17:11:37
UVM Adapter:寄存器模型与总线的“翻译官”

UVM Adapter:寄存器模型与总线的“翻译官”

reg_item 到总线 transaction,谁来做转换? 在 UVM RAL 中,对寄存器的读写操作被抽象为 uvm_reg_item,其内部包含一个或多个 uvm_reg_bus_op 结构体,描述了操作的地址、数据、读写方向等信息。但是,总线上的 driver 和 monitor 交互的对象是用户自定义的 transaction(比…

2026/8/14 17:06:37