软考-软件设计:n位二进制定点小数,原码、反码、补码、移码的取值范围 作者:马育民 • 2025-03-31 17:00 • 阅读:10005 # 说明 本文介绍的是 《软考-软件设计》,所以与工作中的会有些区别 将二进制小数位上的数乘以2的负n次方,然后相加得到的结果就是十进制数 在线进制转换:https://www.sojson.com/hexconvert.html ### 结论  # 4位二进制小数 转十进制(正数原码) ### 4位二进制小数 0100 转十进制 将 二进制 `0100`,转十进制,步骤如下: | |符号位 |第一位 |第二位 |第三位 |第四位 | | ------------ |------------ |------------ |------------ | |原二进制数 |0 |1 |0 |0 |0 | |转十进制数-加权法 |0 |`1*2^-1` | `0*2^-2` |`0*2^-3` |`0*2^-4` | |转十进制数-加权结果 |0 |1/2 | 0 | 0 |0| 结果是:`0.5` ### 4位二进制小数 0010 转十进制 将 二进制 `0010`,转十进制,步骤如下: | |符号位 |第一位 |第二位 |第三位 | | ------------ |------------ |------------ | |原二进制数 |0 |0 |1 |0 | |转十进制数-加权法 |0 |`0*2^-1` | `1*2^-2` |`0*2^-3` | |转十进制数-加权结果 |0 |0 |1/4|0 | 各项相加:`0 + 0 + 0.25 + 0`,结果是:`0.25` ### 4位二进制小数 0111 转十进制 将 二进制 `0111`,转十进制,步骤如下: | |符号位 |第一位 |第二位 |第三位 | | ------------ |------------ |------------ | |原二进制数 |0 |1 |1 |1 | |转十进制数-加权法 |0 |`1*2^-1` | `1*2^-2` |`1*2^-3` | |转十进制数-加权结果 |0 |1/2 | 1/4 | 1/8 | 各项相加:`0.5 + 0.25 + 0.125`,结果是:`0.875` # 4位二进制小数 - 正数原码最大值 `0.875` # n位二进制小数 - 正数原码最大值公式 ``` 0.875 = 1 - 0.125 = 1 - 2^-3 ``` 公式为: ``` 1 - 2^-(n-1) ``` # 4位二进制小数 转十进制(负数原码) ### 4位二进制小数 1100 转十进制 将 二进制 `1100`,转十进制,步骤如下: | |符号位 |第一位 |第二位 |第三位 |第四位 | | ------------ |------------ |------------ |------------ | |原二进制数 |1 |1 |0 |0 |0 | |转十进制数-加权法 |1 |`1*2^-1` | `0*2^-2` |`0*2^-3` |`0*2^-4` | |转十进制数-加权结果 |1 |1/2 | 0 | 0 |0| 结果是:`-0.5` ### 4位二进制小数 1010 转十进制 将 二进制 `1010`,转十进制,步骤如下: | |符号位 |第一位 |第二位 |第三位 | | ------------ |------------ |------------ | |原二进制数 |1 |0 |1 |0 | |转十进制数-加权法 |1 |`0*2^-1` | `1*2^-2` |`0*2^-3` | |转十进制数-加权结果 |1 |0 |1/4|0 | 各项相加:`- (0 + 0.25 + 0)`,结果是:`-0.25` ### 4位二进制小数 1111 转十进制 将 二进制 `1111`,转十进制,步骤如下: | |符号位 |第一位 |第二位 |第三位 | | ------------ |------------ |------------ | |原二进制数 |1 |1 |1 |1 | |转十进制数-加权法 |1 |`1*2^-1` | `1*2^-2` |`1*2^-3` | |转十进制数-加权结果 |1 |1/2 | 1/4 | 1/8 | 各项相加:`- (0.5 + 0.25 + 0.125)`,结果是:`- 0.875` # 4位二进制小数 - 负数原码最小值 与正数相反,即:`-0.875` # n位二进制小数 - 负数原码最小值公式 ``` -0.875 = - (1 - 0.125) = - (1 - 2^-3) ``` 公式为: ``` - (1 - 2^-(n-1)) ``` # n位二进制小数 - 反码范围公式 ### 正数反码 与原码相同 ### 负数反码 在原码的基础上,按位取反,符号位不变,如下: |原码 |反码 | | ------------ | ------------ | |1000 |1111 | |1100 |1011 | |1010 |1101 | |1001 |1110 | |1110 |1001 | |1101 |1010 | |1011 |1100 | |1111 |1000 | **总结:**可以看出,负数反码范围与负数原码相同 ### 取值范围公式 所以反码范围与原码范围相同: ``` 1 - 2^-(n-1) ~ - (1 - 2^-(n-1)) ``` # n位二进制小数 - 补码范围公式 ## 正数补码 正数的补码:就是自己本身 ## 正数补码最大值公式 与正数原码最大值公式相同: ``` 1 - 2^-(n-1) ``` ## 负数补码 负数的补码:在自身 反码 的基础上加 1 |原码 |反码 |补码| | ------------ | ------------ | ------------ | |1000(十进制负0) |1111 |0000(十进制0)| |1100 |1011 |1100| |1010 |1101 |1110| |1001 |1110 |1111| |1110 |1001 |1010| |1101 |1010 |1011| |1011 |1100 |1101| |1111 |1000 |1001| #### 1000 表示什么?(-1的来源) 通过上面的计算得知,不会有补码是 `1000` 因此,这里就特别规定,这个二进制,定义为 `-1`,即:负数最大值 ## 负数补码最小值 所以负数补码最小值是 `-1` # n位二进制小数 - 移码范围公式 补码的 **符号位** 取反,其他与补码相同 所以取值范围与补码相同: ``` -1 ~ 1 - 2^-(n-1) ``` 原文出处:http://malaoshi.top/show_1GWrPBkFncR.html