存储格式
数值存储
- 机器数:数在计算机中二进制表示形式,带符号
- 真值:考虑表示规则,机器数二进制表示的真实数值
大小端
- big-little endian大小端:高位byte在低位byte前
- 更适合人理解
- little-big endian小大端:低位byte在高位byte前
- 更适合计算机计算,大部分计算机架构
- 方便截断操作
- big-little endian大小端:高位byte在低位byte前
符号(有符号数):大部分(静态)语言使用最高位表示符号
0
:正数1
:负数
- 动态语言如 python 的整形不对应定长数据类型,存储逻辑和 cpp/c 等语言相差较大
整形
- 模:衡量计数系统容量的参数,代表了计数系统能表示、存储的状态数
原码、反码、补码
- sign and magnitude 原码:二进制位表示数值本身
- 需要额外符号位标识正负
- ones’ complement 反码:二进制位为真值对计数系统最大值求补
- one:表示有限位计数系统能表示的最大值,即二进制位全为
1
- 符号位不仅标识正负值,且可作为数值位参与运算
- 但不是对模求补
- 存在
+0/-0
问题 - 运算结果和实际结果相差 1
- 存在
- 考虑到二进制位全
1
性质- 正数:反码即为其原码
- 负数:反码为原码符号位不变,数值位取反(因此被称反码)
- one:表示有限位计数系统能表示的最大值,即二进制位全为
- twos’ complement 补码:二进制位为真值对计数系统模求补
- two:表示有限位计数系统容量,即溢出
1
、二进制位全为0
- 符号位不仅标识正负值,且可作为数值位参与运算
- 考虑到是对模求补
-0
表最大负值,不存在+0/-0
问题- 运算结果和实际结果相同
- 将有限位计数系统视为加法封闭群
- 系统中各元素是有序的,为保证加法计算,则最大正值之后必然为最大负值
- 正、负值可视为是对群元素的人为划分
- 可以任意值作为划分,但二进制位计算真值复杂
- 考虑到二进制位全
0
性质- 正数:补码即为其原码
- 负数:补码为反码
+1
(原码也为补码数值位求反后+1
)
- two:表示有限位计数系统容量,即溢出
浮点型
- 遵循 IEEE 754 标准的系统必须支持单精度,最好支持双精度,对扩展精度则无要求
长度 | 符号位 | 指数/阶码 | 尾数 | 有效位数 | 指数偏移/偏阶 | |
---|---|---|---|---|---|---|
单精度 | 32bits | 1bit | 8bits | 23bits | 23bits | 127(规格化)/126(非规格化) |
双精度 | 64bits | 1bit | 11bits | 52bits | 53bits | 1023(规格化)/1022(非规格化) |
扩展精度 | 80bits | 1bit | 15bits | 64bits | 64bits | 16383 |
- 符号位:数值整体正负号
- 指数/阶码:数值小数点位置,也即数值放缩
- 阶码部分没有单独的符号位,为表示负值,则需要规定指数偏移,将 阶码减去偏移量得到实际指数值
- 指数偏移被设置为 $2^{E-1} - 1$ 好处
- 对称正负取值范围
- 首位即可判断浮点值和 1 关系
- 尾数:数值精确程度
- 根据 IEEE 754,规格化值尾数首位(整数位)必须为
1
- 规格化值的尾数值必然大于 1
- 单、双精度可以省略对首位的存储,有效位数比尾数长度多 1
- 扩展精度不区分是否为规格化值
- (单、双精度)非规格化值首位为
0
,同样省略- 非规格化值允许尾数部分小于 1,扩展浮点数对小值的表示
- 所以,非规格化值阶数部分必然(规定)全为
0
- 非规格化值指数偏移量比规格化值小 1,可缩小最小规格化值与最大非规格化值间距
- 根据 IEEE 754,规格化值尾数首位(整数位)必须为
- 特殊浮点值
- 指数值全
1
、尾数非 0:NaN
- 指数值全
1
、尾数为 0:正、负无穷
- 指数值全
- 事实上指数底数可以是任意值,但 IEEE 754 标准规定底数为
2