Lazy loaded image
定点运算
Words 4090Read Time 11 min
2026-1-8
标签
日期
Place
创建时间
Jan 8, 2026 01:50 PM

引言

计算机是处理信息的工具
  • 数据:计算机处理的对象
    • 数值型数据
    • 非数值型数据
  • 地址:表明操作数的位置(或指令的位置)
  • 控制信息:控制计算机的工作
    • 指令:产生各种控制命令的基本依据
    • 标志位:器件的运行状态

数值型数据的表示

总起

一个数值型数据的完整表示涉及到三个方面的问题:
  • 进位计数制
  • 符号数字化(机器码)
  • 小数点位置的处理(定点数与浮点数)

进位计数制

核心要素:
  • 数制的基数(基数确定了,数码即确定)
数制中的基数是指一个数制中所使用的不同的数字符号的个数 eg.二进制(2) 十进制(10) 八进制(8)十六进制(16)
  • 各数位的位权
位权是指每个数码在特定位置所代表的数值大小
计算机内部 (硬件层面) 均采用二进制数编码。但在编程中经常涉及的进位记数制还有八进制、十六进制(通常表示地址码)和十进制(通常用来表示数据)

BCD码(二-十进制表示法)

用四位二进制数表示一位十进制数 数码:0,1 从低位开始四个一组,每组内位权依次为8,4,2,1
每 4 个数码为一组,对应 1 个十进制数字0000~1001
逢十进一 借一当十 个位组:个位的 1 代表 “1 个 1” 十位组:十位的 1 代表 “1 个 10” 举例: 十进制 6 的 BCD 码:0110(个位组,代表 6 个 1); 十进制 5 的 BCD 码:0101(个位组,代表 5 个 1);
  • 先按二进制加法算个位组:0110 + 0101 = 1011
  • 但 BCD 码的 “个位组” 只能表示 0-9(对应 BCD 码 0000-1001),1011 对应十进制 11,超过了 9—— 相当于 “个位小棒满 10 根了”
  • 此时触发 “逢十进一”: ① 给 “十位组” 进 1(十位组原本是 0000,进 1 后变成 0001,代表 1 个 10); ② 个位组减去 10(BCD 码里 10 是1010),1011 - 1010 = 0001(代表 1 个 1);
  • 最终结果:十位组0001 + 个位组0001 → 0001 0001,对应十进制 11 其实不用太过于纠结逢十进一 借一当十,正常计算即可
$$ (137){10} = (0001|0011|0111){BCD} $$
 

各种进位计数制之间的转换

十进制转换为其他进制

十进制转换为二进制

重复相除(乘)法

若是小数则小数点左右(小数部分和整数部分)分别进行处理 整数部分:除基取余法(先得为低位)<本质:逐位生成结果>
小数部分:乘基取整法(先得为高位) $$ \begin{align} 重复乘以2\\ 0.6875\times2=1.3750\\ 0.3750\times2=0.7500\\ 0.7500\times2=1.5000\\ 0.5000\times2=1.0000\\ \end{align} $$ 可知每次取小数部分重复乘以2,最终小数部分的二进制表示为乘以2过程中得数的整数部分的正序即1011
这种方法的规则是整数部分除以2取余数,直到商为0为止;小数部分乘以2取整数,直到小数部分为0为止

按权相加

按权相加的本质<逐位处理输入> $$12_{10}=1_{10}\times10^1_{10}+2_{10}\times10^0_{10}=1010_2+0010_2=1100_2$$

其余不同进制与十进制的转化

均可以使用按权相加法,只是权重不同而已(8、16等)

二进制转换为其他进制

二进制转化为十进制

整数部分: 采用按权相加法(展开成多项式) $$1011_2=1\times2^3+0\times2^2+1\times2^1+1\times2^0=11_{10}$$ 小数部分:小数点后第 n 位(从 0 开始计数)的位权为 $$2^{−(n+1)}$$

二进制与八进制的转化

3位2进制对应1位8进制 $$77_8=111\:111_2$$

二进制与十六进制的转化

4位2进制对应1位16进制 $$7A_{16}=0111\:1010_2$$

不同进制常见的一些写法

![[Pasted image 20250917130712.png]] 0b、0o、0x均是前缀 b、o、h均是后缀

无符号数与有符号数

无符号数

计算机中的数均放在寄存器中,通常称寄存器的位数为机器字长 无符号数:没有符号的数,在寄存器的每一位均可用于存放数值 ![[Pasted image 20250917131537.png]] n位无符号数表示范围:$$0-2^n-1$$

有符号数

用0表示正,1表示负,将符号进行数字化,并且规定将它放在有效数字的前面,即组成了有符号数 ![[Pasted image 20250917131809.png]] 把符号数字化的数称为机器数 带"+""-"符号的数称为真值

有符号数的编码方式

拓展补充

补充:
  1. 二进制的加减乘除二进制的加减乘除法全了看一下叭_二进制加减乘除-CSDN博客
  1. ![[Pasted image 20250922202314.png]]关于小数的二进制转换成十进制
  1. 十进制小数分数与二进制的转换_十进制分数转二进制-CSDN博客
  1. 十进制快速转化成二进制 方法一:1,3,6,12,25 1 1 0 0 1 十进制不断除2不要余数,商写在左边,直到1,然后从左至右,奇数为1,偶数为0 方法二: ![[b9b105073bf918cee59896c68819c858.jpg]]

原码表示法

原码是机器数中最简单的一种表示形式,符号位为0代表正数,符号位为1代表负数,数值即为真值的绝对值 为了书写方便以及区别整数和小数,约定整数的符号位与数值位之间用逗号隔开,小数的符号位与数值位之间用小数点隔开

整数

定义: $$ [x]_{\text{原}} = \begin{cases} 0, x & 0 \leqslant x < 2^n \\ 2^n - x & -2^n < x \leqslant 0 \end{cases} $$
eg.$$\begin{align} x=+1100\qquad[x]{\text{原}}=0,1100\\ x=-1100\qquad[x]{\text{原}}=2^4-(-1100)=10000+1100=1,1100 \end{align}$$ ![[Pasted image 20250917134135.png]] 为了进一步理解: $$ [x]{\text{原}} = \begin{cases} 0, x & 0 \leqslant x < 2^n \\1,|x| & -2^n < x \leqslant 0 \end{cases} $$ $$[x]{\text{原}}=符号位+绝对值$$

小数(|x|<1)

$$ [x]_{\text{原}} = \begin{cases} x & 0 \leqslant x < 1 \\1-x & -1< x \leqslant 0 \end{cases} $$ eg: $$ \begin{align} x=+0.1110\qquad[x]_原=0.1110\\ x=-0.1110\qquad[x]原=1-(0.1110)=1+0.1110=1.1110 \end{align} $$ ![[Pasted image 20250917134723.png]] 进一步理解 $$ [x]{\text{原}} = \begin{cases} 0.|x| & 0 \leqslant x < 1 \\1.|x| & -1< x \leqslant 0 \end{cases} $$ $$[x]_原=符号位.数值位$$
应用: ✔️已知原码求真值(对于定义的理解) ✔️已知真值求原码(套定义) ✔️求0的原码 ![[Pasted image 20250917135431.png]]

性质

  • 原码中零有两种表示形式
  • 原码在运算过程中,符号位需要单独处理 1,1011(-11)+0,0111(+7)=0.1011-0.0111=-0100=1,0100
  • 特点:
    • 优点:数的真值和它的原码之间对应关系简单,相互转换容易
    • 缺点:用原码实现加减运算很不方便

🔆补码表示法

补数

![[Pasted image 20250917140326.png]] 补数:
  • 一个负数可用它的正补数来代替,一个负数加上模即得该负数的补数
  • 一个正数和负数互为补数时,他们的绝对值之和即为模数
  • 正数的补数即为该正数本身
  • 两个互为补数的数分别加上模,结果仍为补数 ![[Pasted image 20250917145736.png]]

整数补码表示

符号位用逗号隔开 $$ [x]_{\text{补}} = \begin{cases} 0, x & 0 \leqslant x < 2^n \\ 2^{n+1} + x & -2^n \leqslant x < 0 \end{cases} $$ eg: $$ \begin{align} x=+1010\qquad [x]_补=0,1010\\ x=-1011000\qquad[x]_补=2^{7+1}+(-1011000)=1,0101000 \end{align} $$

小数的补码表示

符号位用小数点隔开 $$ [x]_{\text{补}} = \begin{cases} x & 0 \leqslant x < 1\\ 2 + x & -1 \leqslant x < 0 \end{cases} $$ eg: $$ \begin{align} x=+0.1110\qquad [x]_补=0.1110\\ x=-0.1100000\qquad[x]_补=2+(-0.1100000)=1.0100000 \end{align} $$

求负数补码的快捷方式

  1. 按位取反 末位相加 ![[Pasted image 20250917151852.png]] 当真值为负时,补码可用“原码符号位保持不变数值位每位取反,末位加 1 求得”(过程可逆)---数值位按位取反、末位加1,符号位为1
  1. 原码最右边的1连同其后的0不变,其前面按位取反

例题

1.两道非常经典+加深理解的题目(理解透彻): ![[Pasted image 20250917153904.png]]
2.拓展题目 ![[Pasted image 20250917155420.png]] 思路二:利用互为相反数的补码之和为模
  • 对于 n 位整数补码,模是 2^n(比如 8 位整数,模是 2^8=256)<连同符号位的>;
  • 对于 n 位小数补码,模是 2(因为小数的范围是 −1∼1−2^-n)

性质

  • 在补码中,0有唯一的编码 $$[+0]_补=0.0000\qquad[-0]_补=0.0000$$
  • 补码在运算过程中,符号位和数值位可同等处理,即二者一起参加运算
  • 补码在负数方向上比原码稍宽(多表示一个数)
    • 对于定点小数 -1
    • 对于定点整数 -2^n
  • 补码适合用于加减运算

反码表示法

反码通常用于作为由原码求补码或者由补码求原码的中间过渡 对一个负数,若对其原码除符号位外,每位取反,或是对其补码减去末位的1

整数

符号位用逗号隔开 $$ [x]_{\text{反}} = \begin{cases} 0, x & 0 \leqslant x < 2^n \\ (2^{n+1} - 1) + x & -2^n < x \leqslant 0 \ (\text{mod}\ 2^{n+1}) \end{cases} $$ eg: $$ \begin{align} x=+1101\qquad[x]_补=0,1101\\ x=-1101\qquad[x]_补=(2^5-1)+(-1101)=11111-1101=1,0010 \end{align} $$ 进一步进行理解:
$$ [x]_{\text{反}} = \begin{cases} 0, x & 0 \leqslant x < 2^n \\ 1,\bar{|x|} & -2^n < x \leqslant 0 \ (\text{mod}\ 2^{n+1}) \end{cases} $$

小数

符号位用小数点隔开 $$ [x]_{\text{反}} = \begin{cases} x & 0 \leqslant x < 1 \\ (2-2^{-n}) + x & -1 < x \leqslant 0 \ (\text{mod}\ 2) \end{cases} $$ eg: $$ \begin{align} x=+0.1101\qquad[x]_反=0.1101\\ x=-0.1010\qquad[x]反=2-2^{-4}+(-0.1010)=1.1111-0.1010=1.0101 \end{align} $$ 进一步理解 $$ [x]{\text{反}} = \begin{cases} 0.x & 0 \leqslant x < 1 \\ 1.\bar{|x|} & -1 < x \leqslant 0 \end{cases} $$
求0的反码 $$ \begin{align} x=+0.0000\qquad [x]_反=0.0000\\ x=-0.0000\qquad[x]_反=1.1111 \end{align} $$ ![[Pasted image 20250917211417.png]]

小结

  • 最高位为符号位,书写上用“,”(整数)或“.”(小数)将数值部分和符号位隔开
  • 对于正数,符号位为 0,且有:原码 = 补码 = 反码
  • 对于负数,符号位位1,其数值部分满足:
    • 原码的数值位和真值相同
    • 补码的数值位为原码的数值位按位取反+1
    • 反码的数值位为原码的数值位按位取反 ![[Pasted image 20250917211754.png]]
  • 设机器数字长为 8 位(其中1位为符号位)对于整数,当其分别代表无符号数、原码、补码和反码时,对应的真值范围各为多少? ![[Pasted image 20250917211837.png|450]]

移码表示法

定义

当真值用补码表示时,由于符号位和数值部分一起编码,与习惯上的表示法不同,很难从形式上直接判断其真值的大小(这是由于补码表示中负数加了 2 n+1 而正数没有加) 方便判断阶码的大小 对正负数均加上2^n 定义: $$[x]_移=2^n+x( -2^n \leqslant x < 2^n)$$ ![[Pasted image 20250917212539.png]] 在数轴上移码所表示的范围恰好对应于真值在数轴上的范围向轴的正方向移动2^n个单位 eg: $$ \begin{align} x=+10100\qquad [x]_移=2^5+10100=1,10100\\ x=-10100\qquad [x]_移=2^5-10100=2^5-1-10100+1=0,01100 \end{align} $$

与补码的比较

x=+1100100 $$ \begin{align} [x]_移=2^7+1100100=1,1100100\\ [x]_补=1100100=0,1100100 \end{align} $$ x=-1100100 $$ \begin{align} [x]_移=2^7-1100100=0,0011100\\ [x]_补=2^{7+1}-1100100=1,0011100 \end{align} $$ 补码与移码只相差一个符号位! ![[Pasted image 20250922125810.png]] 正数:移码>补码 负数:补码>移码 ![[Pasted image 20250922125928.png]]

特点

  1. 当x=0时 $$ \begin{align} [0+]_移=2^n+0=1,0···0\\ [0-]_移=2^n-0=1,0···0\\ [0+]_移=[0-]_移 \end{align} $$
  1. 用移码表示浮点数的阶码能方便地判断浮点数的阶码大小

🔆数的定点表示和浮点表示

定点表示

小数点固定在某一位置的数为定点数 当小数点位于数符和第一数值位之间时,机器内的数为纯小数 当小数点位于数值位之后时,机器内的数为纯整数 采用定点数的机器称为定点机 ![[Pasted image 20250922132203.png]] 混合数 ![[Pasted image 20250922132239.png]] 表示范围 ![[Pasted image 20250922133244.png]] 推导:(见A4纸手写推导) ![[Pasted image 20250922202622.png]] ![[Pasted image 20250922202640.png]]

浮点表示

定义

浮点数:小数点的位置可以浮动的数 ✔️定义: $$N=S\times {r^j}$$ S:尾数(可正可负)---保证既能表示正数,又能表示负数 j:阶码(可正可负)---保证比较大的表示范围 r:基数/基值 计算机中 r 常取 2, 8, 16 等 以基数r=2为例: $$ \begin{align} N=11.0101\\ =0.110101\times{2^{10}}\\ =1.10101\times{2^1}\\ =1101.01\times{2^{-10}}\\ =0.00110101\times{2^{100}} \end{align} $$ 左移一个小数点,阶码+1/右移一位(小数点不动)(x1/2),阶码加1 阶码此处以二进制进行存储

表示形式

定义

采用这种数据格式的机器称为浮点机:
![[f7647f29a019bc0cbdd0f1e509e24207.jpg]]
  • Sf-代表浮点数的符号
  • n-尾数的位数,反映浮点数的精度
  • m-阶码的位数,反映浮点数的表示范围
  • jf 和 j 共同表示小数点的实际位置
浮点数由阶码和尾数两部分组成 阶码是整数,阶符和阶码的位数m合起来反映浮点数的表示范围及小数点的实际位置 尾数是小数,其位数n反映浮点数的精度

特点

  • 优点:在有限位数 (即不增加字长) 内,既能保证有较大的取值范围,又能保证较高的精度。
  • 缺点:浮点运算步骤多,速度慢,硬件成本较高。
  • 适合乘除法较多的情况(乘除法不用考虑规格化)
  • 加减法需要设计额外的规格化电路

🔆表示范围(常考)

思想

以通式为例(上述浮点数的定义),设浮点数阶码的数值位取m位,尾数的数值位取n位,当浮点数为非规格化数时,在数轴上的表示范围如下图: 上溢:阶码 > 最大阶码 下溢:阶码⩽最小阶码 一般按机器零处理
机器零问题: 1.当浮点数阶码等于或小于它所表示的最小数时,不论尾数为何值,按机器零处理 2.当浮点数尾数为 0 时,不论其阶码为何值按机器零处理
![[Pasted image 20250922205241.png]] 推导:套用上述定义(本质上尾数为定点纯小数,阶码为定点整数)
✔️总结:抓住位数x尾数x阶码x是否进行规格化

浮点数的规格化

  • 尾数为纯小数
  • 尾数的值不为0时,其绝对值大于等于十进制的0.5(二进制是0.1)而小于等于1
  • 补码做尾数时的两种特殊情况
    • 尾数的绝对值大于等于-1,小于0.5
    • X = −0.5,[X]补 = 1.100 . . . 0 不是规格化的数
    • X = −1,[X]补 = 1.000 . . . 0 是规格化的数
  • 左规:尾数左移 1 位(×2),阶码减 1
  • 右规:尾数右移 1 位(× 1/2),阶码加 1

例题

  1. ![[Pasted image 20250924150442.png]] 重点在于:
  • 在浮点机中的机器数形式---阶码;尾数
  • 不改变真值补齐数位---整数做补,小数右补,不改变原大小
  1. ![[Pasted image 20250924152609.png]] 梳理有关机器零的注意事项 在处理遇到的机器零问题(主要是浮点数阶码等于所能表示的最小数时,应该将阶码min+1)
  • 移码、补码 $$-2^m->-(2^m-1)$$
  • 原码、反码 $$-(2^m-1)->-(2^m-2)$$
上一篇
年度总结
下一篇
年度总结

Comments
Loading...