计组笔记:第二章-计算机数据表示

重点是定点数和浮点数的表示。数制啥的就不说了,主要还有原码补码反码这几个。下面的讨论都是对于二进制数而言的,因为计算机存储的结构以二进制保存原始值。

定点数

也就是小数点位置不动的数。有两种,纯整数(小数点在最右侧)、纯小数(小数点在最左侧)。分为有/无符号数,前者具有原码、反码、补码、移码四种编码表示。

有符号数的最高位为符号位,0正1负

原码反码和补码

  • 原码:正数是其二进制本身;负数是符号位为1,数值部分取X绝对值的二进制。
  • 反码:正数的反码和原码相同;负数是符号位为1,其它位是原码取反。
  • 补码:正数的补码和原码,反码相同;负数是符号位为1,其它位是原码取反,未位加1。(或者说负数的补码是其绝对值反码未位加1)
  • 移码:将符号位取反的补码(不区分正负)

补码为什么是反码加1?因为它的目的就是为了把减法运算变成加法运算。用表举例子,加上8小时就等于减去4小时(从位置上来看)。二进制也是一样,比如4位二进制数,它的模值就是16,也就是10000。因此,一个数的补就是10000减去这个数,也就是这个数的反码再加1。

补码加减法

  • 在做补码加减法时,只需将符号位和数值部分一起参与运算,并且将符号位产生的进位丢掉即可
  • 补码加法公式
      [X+Y]补 = [X]补 + [Y]补
  • 补码减法公式
      [X-Y]补 = [X]补-[Y]补 = [X]补 + [-Y]补
    其中:[-Y]补称为负补,求负补的办法是:对补码的每一位(包括符合位)求反,且未位加1.

浮点数

类似科学计数法的表示法:$F=M\times 2^E$,$M$称为尾数,$E$称为阶码。

计算机中常见的浮点数存储方式为:数符 阶符 阶码数值部分 尾数数值部分

编码表示

  • 尾数$M$必须是小数,用$n+1$位定点小数表示,可用原码、补码。
  • 阶码$E$必须为整数,以$k+1$位有符号定点整数表示,可用原码、补码、移码。
  • 浮点数编码位数为$m=(n+1)+(k+1)$

规格化浮点数

对尾数无限制可能使得存储空间利用不充分,因此使用规格化形式表示。

定义 将尾数(记为$M$)的绝对值限定在规定的数值范围内:$1/2 \leq |M| \lt 1$,这样的浮点数就是规格化浮点数。实现这一点很简单,下面的尾数以补码表示:

  • $M \geq 0$:$M=0.1\times\times\times\cdots\times$
  • $M \lt 0$:$M=1.0\times\times\times\cdots\times$

浮点数溢出

IEEE754标准

参数 单精度浮点数 双精度浮点数
浮点数长度 32 64
尾数长度$f$ 23 52
符号位$s$ 1 1
指数$e$长度 8 11

单精度浮点数

$$
N=(-1)^S\times 2^{e-127}\times 1.f
$$


IEEE754可以表示规格化浮点数,也可以表示非规格化浮点数。它表示越接近0的数越精确,越接近正负无穷的数越不准确。

浮点数存储

目前计算机主要推行小端存储:浮点数的四个字节从低位到高位分别存储在计算机内存地址的低位到高位。

大小端判断

1
2
3
4
5
void type(){
union{float a; char b;} i;
i.a=1;
printf("%d", i.b);
}

如果输出1,则说明计算机是小端存储。

浮点数模型表示范围

思考题

已知迷你754编码规则如上,求它的表示范围。

BCD编码

典型的有8421码,这四个数字是位权。还有非位权码,比如余3码,格雷码等。

非数值编码

ASCII,GB2312,GBK,还有兼容Unicode-2的编码。汉字编码用了变长数据,技术上类似于霍夫曼编码。

校验码

传输过程中,检验数据是否有丢失/错误的一种检验手段。

奇偶校验码

只有一位校验位,在数据的最高位。它表示数据中包括校验位在内的位的1的个数是奇数还是偶数。前者校验位为1,后者为0。

CRC冗余循环校验码

作者

xeonds

发布于

2023-02-13

更新于

2024-05-13

许可协议

评论