2023.02.13 12:52:00
重点是定点数和浮点数的表示。数制啥的就不说了,主要还有原码补码反码这几个。下面的讨论都是对于二进制数而言的,因为计算机存储的结构以二进制保存原始值。
也就是小数点位置不动的数。有两种,纯整数(小数点在最右侧)、纯小数(小数点在最左侧)。分为有/无符号数,前者具有原码、反码、补码、移码
四种编码表示。
有符号数的最高位为符号位,0正1负
。
补码为什么是反码加1?因为它的目的就是为了把减法运算变成加法运算。用表举例子,加上8小时就等于减去4小时(从位置上来看)。二进制也是一样,比如4位二进制数,它的模值就是16,也就是10000。因此,一个数的补就是10000减去这个数,也就是这个数的反码再加1。
类似科学计数法的表示法:\(F=M\times 2^E\),\(M\)称为尾数,\(E\)称为阶码。
计算机中常见的浮点数存储方式为:数符 阶符 阶码数值部分 尾数数值部分
。
对尾数无限制可能使得存储空间利用不充分,因此使用规格化形式表示。
定义 将尾数(记为\(M\))的绝对值限定在规定的数值范围内:\(1/2 \leq |M| \lt 1\),这样的浮点数就是规格化浮点数。实现这一点很简单,下面的尾数以补码表示:
参数 | 单精度浮点数 | 双精度浮点数 |
---|---|---|
浮点数长度 | 32 | 64 |
尾数长度\(f\) | 23 | 52 |
符号位\(s\) | 1 | 1 |
指数\(e\)长度 | 8 | 11 |
\[ N=(-1)^S\times 2^{e-127}\times 1.f \]
IEEE754可以表示规格化浮点数,也可以表示非规格化浮点数。它表示越接近0的数越精确,越接近正负无穷的数越不准确。
目前计算机主要推行小端存储:浮点数的四个字节从低位到高位分别存储在计算机内存地址的低位到高位。
void type(){
union{float a; char b;} i;
.a=1;
i("%d", i.b);
printf}
如果输出1,则说明计算机是小端存储。
已知迷你754编码规则如上,求它的表示范围。
典型的有8421码,这四个数字是位权。还有非位权码,比如余3码,格雷码等。
ASCII,GB2312,GBK,还有兼容Unicode-2的编码。汉字编码用了变长数据,技术上类似于霍夫曼编码。
传输过程中,检验数据是否有丢失/错误的一种检验手段。
只有一位校验位,在数据的最高位。它表示数据中包括校验位在内的位的1的个数是奇数还是偶数。前者校验位为1,后者为0。