news 2026/4/4 14:44:40

聊聊 C 里的进制转换、移位操作与算术转换

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
聊聊 C 里的进制转换、移位操作与算术转换

前言

学 C 语言时,总绕不开 “进制怎么转”“移位操作符怎么用”“表达式为啥这么算” 这些问题 —— 它们不算多高深,但都是写代码、调 Bug 的基础。

比如写个简单的位运算,若搞不清二进制和十进制的转换逻辑,很容易算错结果;处理表达式时,要是忽略了整型提升的规则,可能会碰到莫名其妙的运行错误。

这篇就整理了自己对进制转换、移位操作符、算数转换这些内容的理解,不求讲得多深,只希望把这些基础知识点理清楚,方便自己回头翻,也给刚入门的朋友做个参考。


目录

一、2进制与进制转换

1、2进制 —> 10进制

2、10进制 —> 2进制

3、2进制 —> 8进制

4、8进制 —> 2进制

5、2进制 —> 16进制

6、16进制 —> 2进制

【2进制、8进制、16进制转10进制总结】

二、原码、反码、补码

三、移位操作符

1、<< 左移操作符

2、>> 右移操作符

四、整型提升

五、算术转换

【整数类型参数表】


一、2进制与进制转换

咱日常说的 “二进制 / 八进制 / 十进制 / 十六进制”,其实就是数字的 “不同穿搭”—— 本质都是同一个数,换身衣服罢了~

比如数字 “15” 的 “穿搭秀”:

二进制款:1111(主打一个极简,就 0 和 1 俩元素)

八进制款:17(穿它得加个前缀0,不然认不出来)

十进制款:15(咱生活里最常穿的 “基础款”)

十六进制款:F(拽哥款,前缀得配0x才够范儿)

二进制的 “穿衣规则”别觉得它高冷,其实和十进制是 “亲戚”:

十进制:凑够 10 个就升级(满 10 进 1),元素是 0~9

二进制:凑够 2 个就跑路(满 2 进 1),元素只有 0 和 1

所以像1101这种 “01 串串”,就是二进制本进制啦~


1、2进制 —> 10进制

其实10进制的123表⽰的值是⼀百⼆⼗三,为什么是这个值呢?其实10进制的每⼀位是有权重的,
10进制的数字从右向左是个位、⼗位、百位....,分别每⼀位的权重是 10^0 , 10^1 , 10^2 ...

如下图:

10进制123每一位权重的理解
2进制和10进制是类似的,只不过2进制的每⼀位的权重,从右向左是:2^0 , 2^1 , 2^2 ...
如果是2进制的1101,该怎么理解呢?
2进制1101每一位的权重理解
你看,二进制1101这么一拆,每一位对应 “2 的次方面额”,乘完一加就得到 13 啦!所以二进制1101
转成十进制,就是咱们算出来的 13—— 这招 “按位拆算”,就是二进制转十进制的万能小妙招~

2、10进制 —> 2进制

这招主打一个 “拆了再拼”:把十进制数当成 “待拆分的大蛋糕”,每次用 2 除它,把剩下的 “余数小块” 记下来,直到除到 0 为止。

比如转 125:

  1. 拿 125÷2,商 62,余 1 → 记个 1
  2. 62÷2,商 31,余 0 → 记个 0
  3. 31÷2,商 15,余 1 → 记个 1……(就这么一直除,一直记余数)最后把记下来的余数从下往上倒着读,就是 1111101—— 这就是 125 对应的二进制啦!

简单说就是:除 2 取余,余数倒排,搞定~


3、2进制 —> 8进制

八进制的特点:每一位是 0~7,而 0~7 的数字转成二进制,最多只需要 3 位(比如 7 的二进制是 111)。

转换规则:从二进制的右边低位开始,每 3 位分为一组,每组转成对应的八进制数;不足 3 位的组直接换算。


4、8进制 —> 2进制

核心逻辑:八进制的每一位(0~7),刚好对应 “3 位二进制数”(比如八进制的 7 对应二进制 111),所以转的时候直接 “1 位八进制→3 位二进制” 展开就行。

操作步骤:

  1. 把八进制的每一位数字,单独转成对应的 3 位二进制数;
  2. 要是某一位转成二进制不足 3 位,就在左边补 0 凑够 3 位;
  3. 把所有位转好的二进制数连起来,就是最终结果。
8进制0153转2进制

5、2进制 —> 16进制

核心逻辑:十六进制每位是 0~9、a~f,这些数字转成二进制最多需要 4 位(比如 f 的二进制是 1111),因此转换时按 “4 位二进制→1 位十六进制” 分组即可。

转换规则:从二进制的右边低位开始,每 4 位分为一组,每组换算成对应的十六进制位;剩余不足 4 位的组直接换算。


6、16进制 —> 2进制

核心逻辑:十六进制的每一位(0~9、a~f),刚好对应 “4 位二进制数”(比如 16 进制的 f 对应二进制 1111),所以转的时候直接 “1 位 16 进制→4 位二进制” 展开即可。

操作步骤

  1. 把 16 进制的每一位数字 / 字母,单独转成对应的 4 位二进制数;
  2. 若某一位转成二进制不足 4 位,在左边补 0 凑够 4 位;
  3. 将所有位转好的二进制数连起来,就是最终结果。

    核心逻辑:十六进制的每一位(0~9、a~f),刚好对应 “4 位二进制数”(比如 16 进制的 f 对应二进制 1111),所以转的时候直接 “1 位 16 进制→4 位二进制” 展开即可。

16进制0xA3转2进制

【2进制、8进制、16进制转10进制总结】

进制转换类型基数位权规则(从右往左,第 k 位)核心计算方式
二进制→十进制22^(k-1)每位 ×2ⁿ 相加
八进制→十进制88^(k-1)每位 ×8ⁿ 相加
十六进制→十进制1616^(k-1)每位 ×16ⁿ 相加

二、原码、反码、补码

整数(有符号整型才用原反补表示)的二进制表示有三种方式:原码、反码、补码。

【通用规则】

有符号整数的这三种表示,都分成符号位数值位两部分:

  • 二进制的最高位是符号位:0代表 “正”,1代表 “负”;
  • 剩下的位是数值位,用来表示具体数值。

【正整数的表示】

正整数的原码、反码、补码完全一样,直接把数值转成二进制,最高位补0(表示正数)就行。比如 + 5(假设是 8 位):

  • 原码 / 反码 / 补码:0000 0101

【负整数的表示】

负整数的原、反、补码各不相同,得按步骤转换:

  1. 原码:把数值转成二进制,最高位补1(表示负数)。比如 - 5(8 位):1000 0101

  2. 反码:原码的符号位不变,数值位按位取反(0 变 1,1 变 0)。比如 - 5 的反码:1111 1010(符号位1不变,数值位000 0101取反成111 1010

  3. 补码:反码的基础上加 1。比如 - 5 的补码:1111 1011(反码1111 1010+1 =1111 1011

【补码转原码】

如果已知补码,想转原码,步骤是:补码按位取反,然后加 1(和 “原码转补码” 的操作一样)。比如补码1111 1011(对应 - 5):

  • 取反:1000 0100
  • 加 1:1000 0101(刚好是 - 5 的原码)

计算机里所有有符号整数的运算(不管是加还是减),全程都是用补码来算的

这是因为 CPU 硬件只有加法器,而补码能把减法 “伪装” 成加法 —— 比如算3-2,实际会变成3 + (-2的补码),用加法就能得到正确结果。

显而易见,用补码计算的结果是正确的 —— 不过这只针对有符号整数;如果是无符号整数,直接用二进制数值计算即可。

三、移位操作符

1、<< 左移操作符

移位规则:左边抛弃、右边补0

左移操作符演示

2、>> 右移操作符

移位规则:⾸先右移运算分两种:
  1. 逻辑右移:左边⽤0填充,右边丢弃
  2. 算术右移:左边⽤原该值的符号位填充,右边丢弃
逻辑右移演示
算术右移演示

通过在 VS 中的实际运行结果可以看出,C 语言中带符号整数的右移操作符(>>),底层遵循的是算术右移规则。

警告⚠️:对于移位运算符,不要移动负数位,这个是标准未定义的。
int num = 10; num>>-1;//error

四、整型提升

关于整型提升,其实是 C 语言里小整型参与运算的 “隐形规则”—— 因为 CPU 的整型运算器默认是int长度,所以charshort这类比int短的类型,在做加减、位运算前,都会先转成int(或unsigned int),这个过程就叫整型提升。

它的核心逻辑很简单:

1、有符号整数提升是按照变量的数据类型的符号位来提升的

2、⽆符号整数提升,⾼位补0
整型提升演示

注意,提升只是运算时的临时转换,运算结束后如果存回小整型变量,结果会被截断回原类型的长度。

五、算术转换

当运算符的两个操作数类型不同时,不能直接运算 —— 得先把类型 “等级低” 的那个,转换成 “等级高” 的类型,这个转换规则就是 “寻常算术转换”。

它的核心是一个 “类型优先级层级表”(等级越靠前,优先级越高):

long double double float unsigned long int long int unsigned int int

转换逻辑很简单:

看两个操作数的类型在层级表里的位置 ——把 “排名靠后”(优先级低)的类型,转换成 “排名靠前”(优先级高)的类型,然后再运算。

总结:

算术转换的目的是 “让不同类型的操作数统一成同一种高优先级类型”,避免运算出错 —— 本质是按 “类型优先级” 向上对齐。

【整数类型参数表】

类型分类位数 (bit)取值范围(十进制)最大值公式
无符号整数80 ~ 2552^8 - 1
160 ~ 655352^16 - 1
320 ~ 42949672952^32 - 1
640 ~ 184467440737095516152^64 - 1
有符号整数(补码)8-128 ~ 1272^7 - 1
16-32768 ~ 327672^15 - 1
32-2147483648 ~ 21474836472^31 - 1
64-9223372036854775808 ~ 92233720368547758072^63 - 1

核心规则:

无符号整数:n 位全部用于表示数值,取值范围是 0 ~ 2^n - 1(无符号位)。

有符号整数(补码):最高位是符号位(1 表示负数,0 表示正数),取值范围是 -2^(n-1) ~ 2^(n-1) - 1 (比无符号少 1 位数值位)。

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

Excalidraw镜像提供健康检查接口,便于运维监控

Excalidraw镜像提供健康检查接口&#xff0c;便于运维监控 在现代云原生架构中&#xff0c;一个看似简单的前端应用能否“稳如磐石”&#xff0c;往往不取决于它的交互多流畅、界面多美观&#xff0c;而在于它是否具备足够的可观测性和自愈能力。Excalidraw 作为一款广受欢迎的…

作者头像 李华
网站建设 2026/4/3 3:12:52

36、异步输入/输出与完成端口技术解析

异步输入/输出与完成端口技术解析 在计算机编程领域,高效的输入/输出操作对于提升程序性能至关重要。本文将深入探讨异步输入/输出(I/O)、可等待计时器、线程池计时器以及 I/O 完成端口等关键技术,为你揭示它们在不同场景下的应用和优势。 异步 I/O 技术 异步 I/O 技术能…

作者头像 李华
网站建设 2026/4/1 15:22:40

2、Windows XP 日常操作与应用指南

Windows XP 日常操作与应用指南 1. 基础文件操作 1.1 创建新文件夹 在 Windows XP 中,若要创建新文件夹来存放即将复制、移动的文件或已安装的程序,可按以下步骤操作: 1. 从 Windows 桌面双击“我的文档”或“我的电脑”文件夹窗口。 2. 点击驱动器,然后找到并点击该驱…

作者头像 李华
网站建设 2026/3/25 9:06:11

Excalidraw与Pabbly Connect集成,企业级自动化就绪

Excalidraw与Pabbly Connect集成&#xff0c;企业级自动化就绪 在今天的研发协作场景中&#xff0c;一个常见的困境是&#xff1a;设计师画完架构图后&#xff0c;还得手动复制链接、发消息提醒、填写工单——明明一张图已经说明了一切&#xff0c;却还要重复“翻译”成各种系统…

作者头像 李华
网站建设 2026/4/1 15:39:28

Excalidraw支持多窗口并列查看,提升工作效率

Excalidraw 多窗口并列查看&#xff1a;如何重塑技术协作的效率边界 在一场远程架构评审会议中&#xff0c;工程师们常面临这样的窘境&#xff1a;一边是正在修改的系统拓扑图&#xff0c;另一边是需要比对的历史版本&#xff1b;手忙脚乱地在两个浏览器标签间反复切换&#xf…

作者头像 李华
网站建设 2026/4/1 18:38:24

Excalidraw新增智能对齐提示线,布局更美观

Excalidraw 的智能对齐与 AI 协作演进&#xff1a;从手绘草图到专业表达的跃迁 在技术团队频繁使用白板进行系统设计、架构评审和需求讨论的今天&#xff0c;一个看似简单却影响深远的问题始终存在&#xff1a;如何在保持自由表达的同时&#xff0c;确保输出内容足够清晰、整齐…

作者头像 李华