软件设计师-进制转换

hisasibuli 久しぶり 好久没有更文,但是前段时间偶然的机会申请blog专家,居然通过了!
虽然: 现在大环境不是很好,blog专家也没有实体证书奖励了,不过私人域名、还有无广告这个还挺满意的;
算了: 不多想了反正,本人已经习惯了断断续续的记录文章,研究了一下blog专家的【政策】哦哦,居然还要定期更文;

  • 着下不得不被催着,更细了,最近工作比较忙l实在没时间写长文,单页不想水文章,不过貌似【软考】比较火
  • 身边也有不少人开始关注,所以决定浅浅尝试一波,后面会慢慢更新【软件设计师】相关的学习blog;

[软件设计师] - 进制转换:

八百里加急,写的🏃‍♂️🏃‍♂️ 虽然如此,还是求一波关注点赞~~ Ok 话不多说开始吧!!

关于进制转换: 很久很久之前学习过,不过已经忘记的差不多了…

生活中常见的进制包括:二进制B、八进制O、十进制、十六进制H

  • 二进制B: 计算机领域应用广泛,数据以 0 和 1 的形式存储在硬盘、

    内存等设备中,逻辑电路中,用高电平表示 1,低电平表示 0 来进行逻辑运算和数据处理;

  • 八进制O: 计算机编程和一些系统设置中有时会用到,八进制与二进制之间有简单的转换关系

    在早期计算机的一些数据处理和存储中,使用八进制可以更方便地对二进制数据进行分组和表示

  • 十进制D: 是日常生活中最常用的进制。在购物时商品的价格标签、货币的计算,如 1 元、5 角、10 分等;

  • 十六进制H: 计算机编程中,内存地址、数据的十六进制表示,颜色通常用十六进制代码来表示,如 #FF0000 表示红色

转换十进制:

二进制=十进制

任意进制转换为十进制,通常采用:位权展开法: 即将任意进制数的每一位数字 乘以 该位的位权

在任何一种进制中,每一位数字所代表的数值大小不仅取决于数字本身,还取决于它所在的位置,就是:位权

以二进制 1000011100 举例: 用位权展开法转换==> 十进制:从右往左0开始, 进 制 位权 进制^{位权} 位权

从右往左 <————— 第3位数字 0 = 2 2 = 4 2^2=4 22=4

从右往左 <————— 第4个数字 0 = 2 3 = 8 2^3=8 23=8

从右往左 <————— 第5个数字 0 = 2 4 = 16 2^4=16 24=16

从右往左 <————— 第10个数字 0 = 2 9 = 512 2^9=512 29=512 将每一位,数字乘以其位权后:相加即可得十进制 = 540

小数部分转换: 以二进制 1000011100.11 举例: 小数点从左往右1开始: 进 制 − 位权 进制^{-位权} 位权

从左往右 <————— 第1个数字 0 = 2 − 1 = 1 2 2^{-1} = \frac{1}{2} 21=21

从左往右 <————— 第2个数字 0 = 2 − 2 = 1 4 2^{-2} = \frac{1}{4} 22=41

小数部分转换为十进制为: 1 2 + 1 4 \frac{1}{2} + \frac{1}{4} 21+41 = 0.75 所以:1000011100.11 =转换十进制= 540.75

八进制=十进制

八进制数的位权是以8为底的幂。例如,将八进制 357.2 数转换为十进制

= 7 ∗ 8 0 + 5 ∗ 8 1 + 3 ∗ 8 2 + 2 ∗ 8 − 1 7*8^0 + 5*8^1 + 3*8^2 + 2*8^{-1} 780+581+382+281

= 7x1 + 5x8 + 3x64 + 2x 1 8 \frac{1}{8} 81

= 7 + 40 + 192 + 0.25

= 239.25

十六进制=十进制

十六进制数的位权是以16为底的幕,

其中A代表10,B代表11,C代表12,D代表13,E代表14,F代表15. 将十六进制数 2A3.E 转换为十进制:

= 3 ∗ 1 6 0 + 10 ∗ 1 6 1 + 2 ∗ 1 6 2 + 14 ∗ 1 6 − 1 3*16^0 + 10*16^1 + 2*16^2 + 14*16^{-1} 3160+10161+2162+14161

= 3x1 + 10x16 + 2x256 + 14x 1 16 \frac{1}{16} 161

= 3 + 160 + 512 + 0.875

= 675.875

十进制=任意进制:

十进制转换为任意进制通常采用 除基取余法乘基取整法 前者用于整数部分的转换,后者用于小数部分的转换

整数部分:除基取余法

将十进制整数除以要转换的进制基数,取余数作为转换后进制数的最低位;

然后将商继续除以基数,再取余数作为次低位,以此类推,直到商为 0 为止,最后将余数从下往上排列,得到转换结果

将十进制数 25 转换为二进制:n\2 余数为 1,这是二进制数的最低位

25/2 = 12 … 1

12/2 = 6 … 0

6/2 = 3 … 0

3/2 = 1 … 1

1/2 = 0 … 1

从下往上排列余数,得到二进制数为:11001

小数部分:乘基取整法

将十进制小数乘以要转换的进制基数,取乘积的整数部分 作为转换后进制数的最高位

然后将乘积的小数部分继续乘以基数,再取整数部分作为次高位,以此类推,

直到小数部分为 0 或达到要求精度;最后将整数部分 从上往下排列

将十进制小数0.625转换为二进制

0.625x2 = 1.25,整数部分为1

0.25 x2=0.5,整数部分为 0

0.5x2=1.0,整数部分为1

从上往下排列整数部分,得到二进制小数为:0.101

十进制=八进制

整数部分:除 8 取余法 + 小数部分:乘 8 取整法 例如,将十进制数 125.6875 转换为八进制

十进制整数除以 8,取余数作为八进制数的最低位

125\8 = 15 … 5

15\8 = 1 … 7

1\8 = 0 ……… 1 从下往上排列余数,得到八进制数为175

小数部位: 十进制小数乘以 8,取乘积的整数部分作为八进制数的最高位

0.6875 x 8 = 5.5,整数部分为5

0.5 x 8 = 4.0,整数部分为4

从上往下排列整数部分,得到八进制小数为0.54,所以十进制:125.6875 =八进制= 175.54

十进制=十六进制

将十进制数 325.8125 转换为十六进制,整数: 将十进制数 325 转换为十六进制:

325\16 = 20 .…… 5

20\16 = 1 .…… 4

1\16 = 0 … 1 从下往上排列余数,得到十六进制数为145

小数部分: 乘 16 取整法,十进制小数0.8125转换为十六进制:

0.8125 x 16 = 13.0,整数部分为 D

得到十六进制小数为 0.D

所以十进制:325.8125 =十六进制= 145.D

二进制-十六进制:

二进制 = 八进制 = 十六进制 = 都有较为迅速的转换方式:因为: 2 3 = 8 2^3=8 23=8 \ 2 4 = 16 2^4=16 24=16

所以可以将二进制数从右至左,每4位分为一组,若最左边一组不足4位,则在左边补0,

然后将每组二进制数转换为对应的十六进制数字,从左往右组合在一起,举例:1101101011

1101101011 从右至左,每4位分为一组,若最左边一组不足4位,则在左边补0

= 0011 0110 1011

= 0011对应3、0110对应6,1011对应B、所以结果为:36B

小数部分: 从左往右 每 4 位二进制数为一组,不足 4 位的在右边补0,然后将每组二进制数转换为对应的十六进制数字;

例如对于二进制小数0.101101 从左往右每4位一组进行划分,得到10110100

= 1011 0100

= 1011对应的十六进制数是B、0100对应的十六进制数是4

= 所以,二进制小数0.101101 转换为十六进制是 0.B4

当然也可以通过:间接转换法=二进制=十进制=十六进制 虽然有点麻烦~ 二进制 = 八进制就分三位一组

数据表示:

真数真数是数学中对数运算里的一个概念

  • 在计算机领域指: 人们在日常生活和数学计算中所使用的真实的数,
  • 可以是整数、小数、正数、负数等各种形式: 2 + 3 = 5 2+3=5 2+3=5 2 3 5 就是真数、物体的温度为:37.5°C 37.5也是真数;

机器数: 在计算机中的表示形式,计算机只能识别和处理二进制数据,

所以需要将各种真数按照一定规则转换为二进制形式存储和运算

  • 无符号数:指在计算机中,所有二进制位 都用于表示数值大小,没有专门的符号位来表示正负的数 都是正数+

    表示范围: 对于n位的无符号数,其取值范围是 2 n − 1 2^n-1 2n1;8 位无符号数的取值范围是0到 2 8 − 1 2^8-1 281 即0到255;

  • 有符号数:在计算机中,用最高位 作为符号位来表示数的正负,其余位表示数值大小的数,

    • 通常规定,符号位0+ 为表示正数,符号位1- 为表示负数

    • 比如:十进制 +5 有符号8位表示:00000101

    • 十进制 -5 有符号8位表示:10000101

机器数特点: 受计算机硬件的限制,

  • 机器数的位数是固定的,如 8 位、16 位、32 位、64 位等
  • 导致机器数能表示的数值范围是有限的,当运算结果超出这个范围时,就会发生溢出
  • 有特定编码方式:为方便计算机进行运算和处理,机器数有多种编码方式,如原码、反码、补码、移码

原码

原码是一种最简单的机器数表示法,最高位为符号位,其中 0 表示正数,1 表示负数,其余位表示数值

  • 假设用 8 位二进制表示一个整数:对于十进制数 +5,其原码为 0000 0101

  • 对于十进制数 -5,其原码为 1000 0101

小数原码表示: 通常规定小数点在符号位之后,最高数值位之前

  • 正小数: 符号位为 0,后面跟着小数部分的二进制表示:对于正小数 +0.625,将 0.625 转换为二进制是 0.101

    用 8 位表示,原码就是 0.1010000(小数点在符号位之后,此处书写时保留小数点,实际存储无小数点)

  • 负小数: 符号位为 1,后面跟着小数绝对值部分的二进制表示:

    对于负小数 -0.625,其 8 位原码是 1.1010000

优点: 直观易懂:原码与真值之间的对应关系非常直观,很容易从原码直接看出其表示的数值大小和正负;

在原码表示中,存在 “+0” 和 “-0” 两种表示形式。例如,8 位二进制中,00000000 表示 +0,10000000 表示 -0

反码

正数的反码与原码相同; 负数的反码是在其原码的基础上,

符号 位保持不变,其余各位取反(即 0 变为 1,1 变为 0)

假设使用 8 位二进制来表示整数:

  • 对于正数 +5,原码是 00000101,由于正数的反码与原码相同,所以 +5 的反码也是 00000101
  • 对于负数 -5,原码是 10000101,符号位不变,其余位取反后得到反码 11111010

通过反码,减法可以转换为加法来处理,在早期的计算机设计中,这种特性有助于降低硬件实现的复杂度

缺点:存在 “+0” 和 “-0” 两种表示形式, 例如,8 位二进制中,+0 的反码是 00000000,-0 的反码是 11111111

补码

正数的补码与原码相同;负数的补码是在其反码的基础上加 1

  • 正数 +5 的原码、反码和补码都是 00000101
  • 负数 -5 的原码是 10000101,反码是 11111010,补码则是在反码的基础上加 1,即 11111011

解决了反码中 “+0” 和 “-0” 表示不唯一的问题。在补码表示中,0 只有一种表示形式,即 00000000——人为定义

移码

移码通常用于表示浮点数的阶码,它是在补码的基础上,将符号位取反得到的

  • 对于真值 +5,其补码0 0000101,将符号位取反后得到移码1 0000101
  • 对于真值 -5,其补码1 1111011,符号位取反后得到移码 0 1111011

移码的一个重要特性是可以直观地比较大小。移码大的对应的真值也大

在浮点数的阶码比较中非常有用,方便计算机快速判断浮点数的大小关系

定点小数

定点小数是指小数点位置固定的小数表示方法:

计算机中,通常将小数点固定在最高数位之前、符号位之后,用于表示绝对值小于 1 的纯小数

  • 原码表示: 正数 +0.625,将 0.625 转换为二进制是 0.101——8 位原码表示为 0.1010000

    对于小数 -0.625,其8位原码是 1.1010000

  • 反码表示:符号位不变,其余数值位取反

    +0.625 的原码是 0.1010000,其反码同样是 0.1010000

    -0.625 的原码是 1.1010000,则反码为 1.0101111.

  • 补码表示:正数的补码与原码一样;负数的补码是在其反码的基础上加 1

    +0.625 的原码、反码、补码都是 0.1010000、-0.625 的反码是 1.0101111,补码则是 1.0110000(反码加 1)。

  • 移码表示: 补码的基础上把符号位取反:+0.625 的补码是0.1010000,其移码是1.1010000

    -0.625的补码是 1.0110000,移码是 0.0110000

数据的表示:

码制定点整数定点小数数码个数
原码 − ( 2 n − 1 − 1 ) -(2^{n-1}-1) (2n11) ~ + ( 2 n − 1 − 1 ) +(2^{n-1}-1) +(2n11) − ( 1 − 2 n − 1 ) -(1-2^{n-1}) (12n1) ~ + ( 1 − 2 n − 1 ) +(1-2^{n-1}) +(12n1) 2 n − 1 2^n-1 2n1
反码 − ( 2 n − 1 − 1 ) -(2^{n-1}-1) (2n11) ~ + ( 2 n − 1 − 1 ) +(2^{n-1}-1) +(2n11) − ( 1 − 2 n − 1 ) -(1-2^{n-1}) (12n1) ~ + ( 1 − 2 n − 1 ) +(1-2^{n-1}) +(12n1) 2 n − 1 2^n-1 2n1
补码 − 2 n − 1 -2^{n-1} 2n1 ~ + ( 2 n − 1 − 1 ) +(2^{n-1}-1) +(2n11) − 1 -1 1 ~ + ( 2 n − 1 − 1 ) +(2^{n-1}-1) +(2n11) 2 n 2^n 2n
移码 − 2 n − 1 -2^{n-1} 2n1 ~ + ( 2 n − 1 − 1 ) +(2^{n-1}-1) +(2n11) − 1 - 1 1 ~ + ( 2 n − 1 − 1 ) +(2^{n-1}-1) +(2n11) 2 n 2^n 2n
  • n-1 次幂,因为最高位是符号位所以 N-1
  • 因为原码反码存在 +0 -0 情况所以,在N位计算机中,需要 -1
  • 而 补码、移码没有 -0 的情况,所以负号范围不需要 -1,定点小数是不大于1的,所以需要 1-

浮点数的表示:

一般出现在高级,中级几乎遇不到、了解一下;

浮点数是计算机科学中用于表示实数的一种数据类型,

它特别适用于需要表达非常大或非常小的数值以及进行复杂数学运算的场景,浮点数的表示方法基于科学计数法

浮点数 的表示: N = 尾数 ∗ 基 数 指数 N=尾数*基数^{指数} N=尾数指数 举例子: 1.25 * 1 0 6 10^6 106

  • 尾数:尾数指的是小数点后的数字部分,它代表了:数值的精度

    计算机内部,为了节省存储空间,浮点数的尾数通常会隐含一个前导的1

    实际存储时不包括这个1,例如,单精度浮点数的尾数部分实际上存储的是0.1234的形式,但理解为1.1234

  • 基数:基数是指在数的表示中使用的数制的基础;

    二进制浮点数中,基数通常是2、十进制科学计数法中,基数是10

    指数(阶码):指数表示尾数需要乘以基数的 多少次幂,指数部分通常经过偏移处理,以便于表示和计算

尾数一般用补码表示(也可以用原码)、基数(阶码)用移码表示,

对阶时,小数向大数看齐,对阶是通过较小数的尾数右移实现的

阶码的位数决定数的表示范围,位数越多范围越大,

尾数的位数决定数的有效精度,位数越多精度越高

浮点数 运算规则:加减法运算

  • 对阶: 将两个浮点数的指数调整为相同的值,

    将指数较小的数的尾数右移相应的位数,使其指数与另一个数相同

    1.23 ∗ 1 0 2 + 4.56 ∗ 1 0 3 1.23*10^2 + 4.56*10^3 1.23102+4.56103 需要将 1.23 ∗ 1 0 2 1.23*10^2 1.23102 转换为 0.123 ∗ 1 0 3 0.123*10^3 0.123103

  • 尾数运算: 对阶后,将两个数的尾数进行加法或减法运算 0.123 ∗ 1 0 3 + 4.56 ∗ 1 0 3 0.123*10^3+4.56*10^3 0.123103+4.56103 计算尾数:0.123+4.56 = 4.683

  • 结果格式化: 检查运算结果是否需要进行规格化处理,规格化的目的是确保尾数的绝对值在1到10之间(对于十进制浮点数)

    如果尾数绝对值大于等于10,则需要尾数右移一位,并将指数加1,

    如果尾数的绝对值小于1,则需要将尾数左移一位,指数减1


🆗 🆗 如此结束,求关注——后面会持续更新,【软件设计师】 的blog - 最后祝愿大家,顺利上岸~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/38858.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jetpack Compose 选项卡控件实现

这里写目录标题 介绍主体解释 介绍 实现选项卡控件 主体 import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.…

Java 大视界 -- Java 大数据在智慧文旅旅游目的地营销与品牌传播中的应用(150)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

使用密码连接Redis服务的两种方式

说明&#xff1a;本文介绍连接需要密码的Redis服务的两种方式 方式一 连接时&#xff0c;携带密码&#xff0c;如下&#xff1a; redis-cli -a [密码]如下&#xff1a; 有两个问题&#xff1a; 密码直接放在命令里&#xff0c;可通过 history 找到&#xff0c;不安全&#x…

搭建React简单项目

一、项目构建 目录结构&#xff1a; 安装脚手架 npm install -g create-react-app // or yarn add -g create-react-app 一、项目版本 1、react&#xff1a;"^18.3.1"&#xff1b; 2、react-router-dom&#xff1a;"^6.23.1"&#xff1b; 3、项目创…

知识库已上线

目录 知识库上线了加入知识库注册账号切换租户加入租户找到知识库点击申请等待管理员审核通过后&#xff0c;点击去后台可以开始创作了创建我们的第一个知识库点击详情进入创作页面&#xff0c;创建我们的第一篇知识 发布知识将我们的知识库变更为公开状态发布知识等待管理员审…

对象克隆以及BigInteger()方法,与BigDecima()方法的学习

BigInteger&#xff08;&#xff09;方法&#xff1a; ①获取一个随机的大整数&#xff1a; public class Test3 {public static void main(String[] args) {Random rnew Random();BigInteger bigIntegernew BigInteger(4,r);System.out.println(bigInteger);} } ②&#xf…

学习记录-vue2,3-vue实现tab栏

目录 vue实现tab栏功能描述实现效果vue实现tab栏实现步骤1. 概念理解2. Tab栏切换 完整实例代码 vue实现tab栏功能描述 选项卡切换选中状态 实现效果 vue实现tab栏实现步骤 1. 概念理解 了解vue的基础指令 代码含义v-on绑定事件&#xff0c;可以简写为:事件名“执行体”。…

【读书笔记】华为《从偶然到必然》

note 华为的成功并非偶然&#xff0c;而是通过IPD体系、投资组合管理、平台战略等系统性工具&#xff0c;将研发投资转化为可持续的商业竞争力。书中强调的“管理即内部因素”理念&#xff0c;揭示了企业规模扩张与管理能力匹配的深层规律&#xff0c;为高科技企业提供了可借鉴…

表达式树和编译原理【10道经典面试题】(中英对照)

表达式树&#xff08;Expression Tree&#xff09; 是一种用于表示数学表达式的二叉树结构。它在编译器设计、数学计算引擎、符号计算等领域有着广泛的应用&#xff08;《表达式树&#xff08;Expression Tree&#xff09;在编译器中的应用》&#xff09;。理解表达式树的构建、…

【redis】主从复制:单点问题、配置详解、特点详解

文章目录 单点问题什么是主从复制主从模式能解决的问题并发量有限可用性问题 配置建立复制通过配置文件来指定端口配置主从查看集群结构 断开复制 特点安全性只读传输延迟 单点问题 分布式系统中&#xff0c;涉及到一个非常关键的问题&#xff1a;单点问题 某个服务器程序&…

VSCode 生成HTML 基本骨架

在VSCode 新建html文件中敲一个英文感叹号 ! <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><titl…

STM32定时器-01定时器概述

内容概述 定时器是STM32中功能最强大、结构最复杂的一个外设&#xff0c;分为四部分&#xff1a; 一部分&#xff1a;定时中断功能 二部分&#xff1a;定时器输出比较&#xff0c;常见的用途&#xff1a;产生PWM波形&#xff0c;驱动电机&#xff08;如驱动舵机和直流电机&…

在 Ubuntu 中用 Docker 安装 RAGFlow

一、安装 1.前提条件 CPU > 4 核 RAM > 16 GB Disk > 50 GB Docker > 24.0.0 & Docker Compose > v2.26.1 安装docker&#xff1a;在Ubuntu中安装Docker并配置国内镜像 2.设置 vm.max_map_count #设置 vm.max_map_count 不小于 262144# 查看 sysctl vm.…

17153 班级活动

17153 班级活动 ⭐️难度&#xff1a;简单 &#x1f31f;考点&#xff1a;2023、思维、国赛 &#x1f4d6; &#x1f4da; import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class Main {static int N 10…

Java IO 流:从字节到字符再到Java 装饰者模式(Decorator Pattern),解析与应用掌握数据流动的艺术

在 Java 编程中&#xff0c;IO&#xff08;输入输出&#xff09;流是处理数据输入输出的核心工具。无论是读取文件、网络通信&#xff0c;还是处理用户输入&#xff0c;IO 流都扮演着重要角色。本文将深入探讨 Java IO 流的核心概念、分类、经典代码实例及其应用场景&#xff0…

HTTPS

目录 一 HTTPS是什么 二 加密 三 加密方案 四 CA机构/证书 五 最终方案(对称密钥/非对称密钥/CA证书)和总体流程 一 HTTPS是什么 在应用层存在SSL&#xff0c;TLS(HTTP之下&#xff0c;传输层之上)加密/解密安全协议&#xff0c;如果HTTP经过这个协议&#xff0c;对端也走…

StarRocks 主键(Primary Key)深度解析

一、StarRocks 产品简介 StarRocks 是一款高性能分析型数据库&#xff0c;专为海量数据的实时分析而设计。作为新一代湖仓&#xff08;Lakehouse&#xff09;加速引擎&#xff0c;StarRocks 融合了 MPP 架构和列式存储引擎的优势&#xff0c;能够支持亿级数据秒级查询响应。 …

(学习总结30)Linux 进程优先级、进程切换和环境变量

Linux 进程优先级、进程切换和环境变量 进程优先级基本概念查看系统进程PRI 和 NI 解释进程优先级调整命令行调整进程优先级调整新进程调度优先级命令 nice调整已运行进程调度优先级命令 renice 使用 top 调整进程优先级使用系统调用调整进程优先级 进程的竞争、独立、并行、并…

《Manus学习手册》.pdf(文末附完整版下载地址)

大家好&#xff0c;我是吾鳴。 吾鳴今天要给大家分享的一份比较全面详细的Manus学习手册&#xff0c;该学习手册主要包含Manus产品概述与核心理念、Manus功能与使用场景、Manus技术架构与工作流、Manus案例库与用户实践、邀请码获取与内测信息、Manus与传统AI对比与优势、用户评…

【MySQL】从零开始:掌握MySQL数据库的核心概念(三)

人生碌碌&#xff0c;竞短论长&#xff0c;却不道枯荣有数&#xff0c;得失难量。 前言 这是我自己学习MySQL数据库的第二篇博客总结。后期我会继续把MySQL数据库学习笔记开源至博客上。 上一期笔记是关于MySQL数据库的数据类型&#xff0c;没看的同学可以过去看看&#xff1a…