久しぶり好久没有更文但是前段时间偶然的机会申请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 2242^24224从右往左 ————— 第4个数字 0 2382^38238从右往左 ————— 第5个数字 0 24162^4162416从右往左 ————— 第10个数字 0 295122^951229512将每一位数字乘以其位权后相加即可得十进制 540小数部分转换以二进制 1000011100.11 举例:小数点从左往右1开始进制−位权进制^{-位权}进制−位权从左往右 ————— 第1个数字0 2−12^{-1}2−112\frac{1}{2}21从左往右 ————— 第2个数字0 2−22^{-2}2−214\frac{1}{4}41小数部分转换为十进制为12\frac{1}{2}2114\frac{1}{4}41 0.75所以1000011100.11 转换十进制 540.75八进制十进制八进制数的位权是以8为底的幂。例如将八进制 357.2 数转换为十进制7∗805∗813∗822∗8−17*8^0 5*8^1 3*8^2 2*8^{-1}7∗805∗813∗822∗8−1 7x1 5x8 3x64 2x18\frac{1}{8}81 7 40 192 0.25 239.25十六进制十进制十六进制数的位权是以16为底的幕其中A代表10B代表11C代表12D代表13E代表14F代表15. 将十六进制数2A3.E转换为十进制3∗16010∗1612∗16214∗16−13*16^0 10*16^1 2*16^2 14*16^{-1}3∗16010∗1612∗16214∗16−1 3x1 10x16 2x256 14x116\frac{1}{16}161 3 160 512 0.875 675.875十进制任意进制十进制转换为任意进制通常采用除基取余法和乘基取整法前者用于整数部分的转换后者用于小数部分的转换整数部分除基取余法将十进制整数除以要转换的进制基数取余数作为转换后进制数的最低位然后将商继续除以基数再取余数作为次低位以此类推直到商为 0 为止最后将余数从下往上排列得到转换结果将十进制数 25 转换为二进制n\2 余数为 1这是二进制数的最低位25/2 12 … 112/2 6 … 06/2 3 … 03/2 1 … 11/2 0 … 1从下往上排列余数得到二进制数为11001小数部分乘基取整法将十进制小数乘以要转换的进制基数取乘积的整数部分作为转换后进制数的最高位然后将乘积的小数部分继续乘以基数再取整数部分作为次高位以此类推直到小数部分为 0 或达到要求精度最后将整数部分从上往下排列将十进制小数0.625转换为二进制0.625x2 1.25整数部分为10.25 x20.5整数部分为 00.5x21.0整数部分为1从上往下排列整数部分得到二进制小数为0.101十进制八进制整数部分除 8 取余法小数部分乘 8 取整法例如将十进制数 125.6875 转换为八进制十进制整数除以 8取余数作为八进制数的最低位125\8 15 … 515\8 1 … 71\8 0 ……… 1 从下往上排列余数得到八进制数为175小数部位十进制小数乘以 8取乘积的整数部分作为八进制数的最高位0.6875 x 8 5.5整数部分为50.5 x 8 4.0整数部分为4从上往下排列整数部分得到八进制小数为0.54所以十进制125.6875 八进制 175.54十进制十六进制将十进制数 325.8125 转换为十六进制整数将十进制数 325 转换为十六进制:325\16 20 .…… 520\16 1 .…… 41\16 0 … 1 从下往上排列余数得到十六进制数为145小数部分: 乘 16 取整法十进制小数0.8125转换为十六进制0.8125 x 16 13.0整数部分为 D得到十六进制小数为0.D所以十进制325.8125 十六进制 145.D二进制-十六进制二进制 八进制 十六进制 都有较为迅速的转换方式因为2382^38238\24162^4162416所以可以将二进制数从右至左每4位分为一组若最左边一组不足4位则在左边补0然后将每组二进制数转换为对应的十六进制数字从左往右组合在一起举例11011010111101101011从右至左每4位分为一组若最左边一组不足4位则在左边补0 0011 0110 1011 0011对应3、0110对应61011对应B、所以结果为36B小数部分从左往右每 4 位二进制数为一组不足 4 位的在右边补0然后将每组二进制数转换为对应的十六进制数字例如对于二进制小数0.101101 从左往右每4位一组进行划分得到10110100 1011 0100 1011对应的十六进制数是B、0100对应的十六进制数是4 所以二进制小数0.101101转换为十六进制是0.B4当然也可以通过间接转换法二进制十进制十六进制虽然有点麻烦~二进制 八进制就分三位一组数据表示真数真数是数学中对数运算里的一个概念在计算机领域指人们在日常生活和数学计算中所使用的真实的数可以是整数、小数、正数、负数等各种形式2352352352 3 5就是真数、物体的温度为37.5°C37.5也是真数机器数在计算机中的表示形式计算机只能识别和处理二进制数据所以需要将各种真数按照一定规则转换为二进制形式存储和运算无符号数指在计算机中所有二进制位都用于表示数值大小没有专门的符号位来表示正负的数都是正数表示范围对于n位的无符号数其取值范围是2n−12^n-12n−18 位无符号数的取值范围是0到28−12^8-128−1即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 表示 010000000 表示 -0反码正数的反码与原码相同负数的反码是在其原码的基础上符号位保持不变其余各位取反即 0 变为 11 变为 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其补码是00000101将符号位取反后得到移码10000101对于真值 -5其补码是11111011符号位取反后得到移码01111011移码的一个重要特性是可以直观地比较大小。移码大的对应的真值也大在浮点数的阶码比较中非常有用方便计算机快速判断浮点数的大小关系定点小数定点小数是指小数点位置固定的小数表示方法计算机中通常将小数点固定在最高数位之前、符号位之后用于表示绝对值小于 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.补码表示正数的补码与原码一样负数的补码是在其反码的基础上加 10.625 的原码、反码、补码都是 0.1010000、-0.625 的反码是 1.0101111补码则是 1.0110000(反码加 1)。移码表示补码的基础上把符号位取反0.625 的补码是0.1010000其移码是1.1010000-0.625的补码是 1.0110000移码是 0.0110000数据的表示码制定点整数定点小数数码个数原码−(2n−1−1)-(2^{n-1}-1)−(2n−1−1)~(2n−1−1)(2^{n-1}-1)(2n−1−1)−(1−2n−1)-(1-2^{n-1})−(1−2n−1)~(1−2n−1)(1-2^{n-1})(1−2n−1)2n−12^n-12n−1反码−(2n−1−1)-(2^{n-1}-1)−(2n−1−1)~(2n−1−1)(2^{n-1}-1)(2n−1−1)−(1−2n−1)-(1-2^{n-1})−(1−2n−1)~(1−2n−1)(1-2^{n-1})(1−2n−1)2n−12^n-12n−1补码−2n−1-2^{n-1}−2n−1~(2n−1−1)(2^{n-1}-1)(2n−1−1)−1-1−1~(2n−1−1)(2^{n-1}-1)(2n−1−1)2n2^n2n移码−2n−1-2^{n-1}−2n−1~(2n−1−1)(2^{n-1}-1)(2n−1−1)−1- 1−1~(2n−1−1)(2^{n-1}-1)(2n−1−1)2n2^n2nn-1 次幂因为最高位是符号位所以 N-1因为原码反码存在 0 -0 情况所以在N位计算机中需要 -1而 补码、移码没有 -0 的情况所以负号范围不需要 -1定点小数是不大于1的所以需要 1-浮点数的表示一般出现在高级中级几乎遇不到、了解一下浮点数是计算机科学中用于表示实数的一种数据类型它特别适用于需要表达非常大或非常小的数值以及进行复杂数学运算的场景浮点数的表示方法基于科学计数法浮点数的表示N尾数∗基数指数N尾数*基数^{指数}N尾数∗基数指数举例子 1.25 *10610^6106尾数尾数指的是小数点后的数字部分它代表了数值的精度计算机内部为了节省存储空间浮点数的尾数通常会隐含一个前导的1实际存储时不包括这个1例如单精度浮点数的尾数部分实际上存储的是0.1234的形式但理解为1.1234基数基数是指在数的表示中使用的数制的基础二进制浮点数中基数通常是2、十进制科学计数法中基数是10指数(阶码)指数表示尾数需要乘以基数的多少次幂指数部分通常经过偏移处理以便于表示和计算尾数一般用补码表示(也可以用原码)、基数(阶码)用移码表示对阶时小数向大数看齐对阶是通过较小数的尾数右移实现的阶码的位数决定数的表示范围位数越多范围越大尾数的位数决定数的有效精度位数越多精度越高浮点数运算规则加减法运算对阶将两个浮点数的指数调整为相同的值将指数较小的数的尾数右移相应的位数使其指数与另一个数相同1.23∗1024.56∗1031.23*10^2 4.56*10^31.23∗1024.56∗103需要将1.23∗1021.23*10^21.23∗102转换为0.123∗1030.123*10^30.123∗103尾数运算 对阶后将两个数的尾数进行加法或减法运算0.123∗1034.56∗1030.123*10^34.56*10^30.123∗1034.56∗103计算尾数0.1234.56 4.683结果格式化检查运算结果是否需要进行规格化处理规格化的目的是确保尾数的绝对值在1到10之间(对于十进制浮点数)如果尾数绝对值大于等于10则需要尾数右移一位并将指数加1如果尾数的绝对值小于1则需要将尾数左移一位指数减1 如此结束求关注——后面会持续更新【软件设计师】 的blog - 最后祝愿大家顺利上岸~~