数字类型 - 表示和编码
时间有限,草稿版本,以后深入研究再修。
前言
一般地讲,数字类型的存储可以分为两层抽象,表示形式和(对表示形式)的编码方式。
整型(Integer)
表示形式
整型数字的表示形式没有什么特别的,就是它的自然二进制表示。1
编码方式
对于无符号整数和有符号的正整数来说,编码方式就是自然的二进制表示,只有对于有符号的负整数(包括负零)要考虑特别的编码方式。
有几种对于负整数的编码方式:
幅值编码(Sign–magnitude)
除了在最高有效位标记外,其他部分和正整数或无符号整数一样。
1 的补码(Ones’ complement)
对负整数的每一位都取反。
2 的补码(Two’ complement)
对负整数的每一位都取反,再加 1 。
主流编码方式。
偏移二进制(Offset binary)
也称为 excess-K ,就是加一个 K ,使得负数变为正数。
IEEE-754 规范的浮点数的指数部分就采用了这个方法的一个变种。
-2 基数
浮点数(Float)
这里讲的是 IEEE-754 标准的浮点数。
表示形式
二进制形式的科学记数法。
\[( s ) \ 1.( t ) \times 2^{( e )}\]十进制与二进制转换
使用过程中,隐含一个对于十进制与二进制转换的问题。
对于整数部分,没有任何问题,但是对于小数部分,很多常见的十进制数字是不能由 $2^{-1} + 2^{-2} + \dots 2^{-n}$ ,所精确表示的,实际存储的是一个近似的数学上的积分表示。
精度取舍
在向低精度舍入时,可以允许配置多种舍入策略,标准实现应该提供 roundTiesToEven
策略和 roundTowardPositive
, roundTowardNegative
和 roundTowardZero
这三种有特定舍入方向的策略。
其中 roundTiesToEven
应该把它作为二进制表示数字的默认策略,十进制的表示数字的舍入策略是语言特定的,但也应当采取该策略。
roundTiesToEven
首先选择距离最近的那个数,
否则如果存在两个等距离候选,就选择那个最低有效位是偶数的,
否则就选精度部分数字(magnitude)最大的。
编码方式
按照最高有效位(MSB)的顺序具体如下:2

S
符号位,没什么好说的,最高有效位标记表示负数。
E
由于指数部分实际上是一个有符号整数,这里采取了 excess-K 的编码方案,$K=2^{e-1}-1$ ,这样距离零最远的负数加上 $K$ 后恰好为 $0$。
T
精度部分,省略了小数点前面固定的 $1$ 。
特殊值
当精度部分为 $0$ ,指数部分最小(偏移后为 $0$ ),此时存在当前精度无法表示的小数,也就是发生了 underflow ,此时的状态称为 subnormal。
反过来,如果指数部分最大(偏移后全为 $1$),则可能成为 $\pm\ \infty$ ,或者 NaN 。
规定精度部分全为 $0$ 则是 $\pm\ \infty$,否则为 NAN ,特别地 IEEE-754-2008 之后规定了精度部分最高有效位 $d_1$ 为 $0$ 表示 signaling NAN ,而其他属于默认的 quiet NAN。