Chapter 2. 数据的表示和运算
公式与性质
-
十进制数转换为任意进制数:(整数部分)除基取余,先余为低,后余为高;(小数部分)乘基取整,先整为高,后整为低。(都是从小数点向左/向右写)
-
不是每个十进制小数都能用准确地用二进制表示,但任意一个二进制小数都能用十进制小数表示。
-
用补码整数表示整数,原码小数表示浮点数的尾数部分,移码表示浮点数的阶数部分。
-
正数补码 = 原码 = 反码,负数补码 = 原码数值位取反 +1(最右边的 1 及其右侧不变,左侧全部取反);补码转回原码操作完全相同。
-
移码 = 补码将符号位取反。
-
原码 0 有两种(正零和负零),补码和移码 0 只有一种。
-
对于负数补码、反码,数值位部分越小,该数越小。
-
无符号整数进行零扩展,有符号整数进行符号扩展。
-
Overflow Flag, OF
溢出标志:带符号数是否溢出。 OF=C_n \oplus C_{n-1} (最高位进位 \oplus 次高位进位)。 -
Carry Flag, CF
进/借位标志:无符号数是否溢出。 CF=C_{out} \oplus C_{in} (最高位进位 \oplus 低位进位)。 -
Sign Flag, SF
符号标志:和的符号。 -
Zero Flag, ZF
零标志:结果为零时 ZF=1 。 -
ALU
的核心是带符号加法器。 -
控制信号(来自控制器) m \ bit ,如果
ALU
支持 k 种控制,则 m \ge \lceil \log _2 k \rceil 。 -
计算机字长由
ALU
运算位数决定。 -
在字长为 32 位的计算机中,
int
的乘积若高 32 位的每一位都相同且等于低 32 位的符号,则不溢出,否则溢出。对于unsigned int
,若高 32 位全为 0 ,则不溢出,否则溢出。 -
IEEE 754
- 在阶码(移码表示)不为 0 时,尾数(原码表示)隐含表示最高位 1 ;阶码为 0 时尾数隐含表示最高位 0 。
- 浮点数的格式
类型 符号 s 阶码 e 尾数 f 总位数 偏置值 单精度 1 8 \ (1 \sim 254) 23 32 127 双精度 1 11 \ (1 \sim 2046) 52 64 1023 - 阶码 - 偏置值 = 指数
- 阶码全 0 ,尾数全 0 ,表示 \pm 0 ,此时尾数隐含 0 而不是 1 。
- 阶码全 1 ,尾数全 0 ,表示 \pm \infty 。
- 阶码全 0 ,尾数非 0 ,表示
NaN
。 - 阶码全 1 ,尾数非 0 ,表示非规格化数。
-
浮点数的加减运算
- 对阶
- 小阶码向大阶码看齐
- 尾数加减
- 尾数规格化
1x.x...x
时右规0.0...01x...x
时左规
- 舍入
- 对阶
-
数据的大小端存储
- 大端:先存储高位字节,再存储低位字节。顺序与原序列相同。
- 小端:先存储低位字节,再存储高位字节。顺序与原序列相反。
-
对齐存储指的是按机器字长对齐。
概念
-
n 位定点数的表示范围
表示方式 定点整数 定点小数 原码 -(2^{n-1}-1)\sim (2^{n-1}-1) -(1-2^{-(n-1)})\sim(1-2^{-(n-1)}) 反码 -(2^{n-1}-1)\sim (2^{n-1}-1) -(1-2^{-(n-1)})\sim(1-2^{-(n-1)}) 补码 -2^{n-1}\sim(2^{n-1}-1) -1\sim (1-2^{-(n-1)}) 移码 -2^{n-1}\sim(2^{n-1}-1) -1\sim (1-2^{-(n-1)}) 原码和反码表示范围相同,补码和移码表示范围相同。
-
阵列乘法器输入并行,每个位同时计算,可认为是全并行运算的乘法器。
-
浮点运算器可用两个松散连接的定点运算器部件——阶码部件和尾数部件来实现。
阶码和尾数可以分别处理。
-
对于
IEEE
浮点数,如果减少 1 位指数位,将其用于小数部分,能表示的最大实数变小,最小的实数变大,但数值的精度更高,能表示的实数数量可能发生变化。
考点
-
8 位补码有符号定点整数表示的最小数的二进制形式是
1000 0000
。最小数不能用常理计算,记忆即可。
-
已知 x<0 且为小数,其编码为 n 位,则满足 [x]_补 = [x]_原 的真值 x 为 -2^{-1} 。
-
执行
unsigned short usi = 65535; short si = usi;
后,si
的值是 -1 。65535
的无符号二进制为1111 1111 1111 1111
,视为有符号后,其原码为1000 0000 0000 0001
。 -
双符号位补码,若运算结果符号位为
01
,则为正溢出;若为10
,则为负溢出。 -
IEEE 754
中32
位浮点数的最大规格化正数为 [1+(1-2^{-23})]\times 2^{127}=2^{128}-2^{104} ,最小规格化负数为 -[(1+(1-2^{-23})]\times 2^{127}=-(2^{128}-2^{104}) ;64
位同理。IEEE 754
32
位浮点数表示范围为 (-1)^S\times1.m\times2^{E-127} ,其中S
为符号位,m
为尾数,E
为阶码。当数最大时,m=111 1111 1111 1111 1111 1111
,E=254 ,最小时取负数即可。 -
设浮点数的阶码和尾数均采用补码表示,且位数分别为 5 和 7 (均含 2 位符号位),若有两个数 X=2^7 \times \frac {29} {32}, Y=2^5\times\frac 5 8 ,则用浮点加法计算 X+Y 的最终结果是发生溢出。
X: 00|111|00|11101 Y: 00|101|00|10100 Y 向上对阶为 Y': 00|111|00|00101 X + Y': 00|111|01|00010 (尾数正溢出) 对尾数右规: 01|000|00|10001 (阶数正溢出)
-
尾数舍入的过程包含右规。
-
两规格化浮点数相加,最后对结果规格化时,右规的右移位数最多为 1 位,左规的左移位数最多为 尾数位数-1 位。
-
若浮点数用补码表示,则数符与尾数小数点后第一位数字相异为规格化数。
-
函数和初始化的全局变量(包括显式初始化为
0
)是强符号,未初始化的全局变量是弱符号。同名的强符号只能有一个。允许一个强符号和多个弱符号,但链接器会选择强符号。当有多个弱符号相同时,链接器选择最先出现的。 -
若 f=1.5678\times 10^3
(IEEE 754 float)
,d=1.5\times10^{100}(IEEE 754 double)
,则(d+f)-d==f
为假。对阶时尾数会丢失。