数据的位表示
整数:补码 (2's complement)
编码
编码是给定位数的二进制串到数字的映射,可以看成一个函数
例如,
2 位的补码也是一种编码:
编码
负数
原码只能表示正数。那么,一个兼容负数的编码
从计算机硬件的角度考量,无符号数(原码)的加法器和乘法器是必须的(我们的 LC-3 虽然没有乘法指令,但你也可以自己补充)
我们希望
- 减法即加上相反数,因此
编码只需要考虑加法,不需要额外考虑减法
给出
- 该编码下数字的加法应该等于编码之和(复用无符号数的加法器)
- 该编码下数字的乘法也应该等于编码的乘法(复用无符号数的乘法器)
该编码应该能表示尽可能多的数字,我们假设
是一一映射(即存在反函数 )该编码值域应该是连续的
,其中 ,结合性质三可知
解法一:
性质二代入
等式左侧
性质二代入
同理,得
再解
在性质一中令
同时取反函数
已知
同理
归纳,便得到所有负数
而
归纳,便得到所有正数
到这里,任意给定一个
对于一个二进制串
- 若
- 若
事实上,
注意到一个二进制串作为正数和作为负数的取值恰好相差
这也就导致符合要求的编码方式
方便起见,一般约定
解法二:
如果考虑溢出,无符号数的加法(乘法)器的一个更合适的称呼是模
例如,在 4 位原码下,
但如果按照模
最后的等号是顺理成章的,因为
在这个意义上,性质一和性质二的同余符号就不再需要了
从代数结构的角度,这说明二进制串的结构是一个环,且与模
不太严谨地,我们直接得出结论
具体
负数的补码表示:
在明白了补码的结构之后,可以轻松证明
首先有
两边取反函数
移项
浮点数:IEEE 754
以 32 位单精度浮点数为例
float32 内存表示
浮点数类似于科学计数法,分别储存一个数的有效数字和指数
sign 符号位
用于标识正负,0 代表正,1 代表负
exponent 指数位
8 位无符号整数,范围
fraction 尾数位
二进制数的第一位有效数字必定是
故实际有效数字为:
float32 含义及转换
一般来说 (
求出
- 先将一个数转换为二进制
- 再正则化处理(分解成有效数字和指数)
- 最后按 IEEE 规约,填入符号位,指数位,尾数位
非正规形式
即
尾数位代表的有效数字是
约定此时指数位的值与
实际表示的值
最小的非
有趣的是,浮点数的
计算
JavaScript 试一试
计算
JavaScript 试一试
虽然这两个零符号不同,但根据标准,它们在比较时应该是相等的(因此在写代码时,可以不太考虑这两个
JavaScript 试一试
特殊值
当
- 若小数部分为 0,表示(正/负)无穷(正如上面试一试中你能够得到的结果)
- 若小数部分不为 0,表示 NaN (Not a Number)
NaN 仅在含义上表示(这个运算结果)不是一个数,但在类型上,NaN 毫无疑问是一个(特殊的)(浮点)数
JavaScript 试一试
结果应该为 number