少女祈祷中...

数据的机器级表示

在冯诺依曼结构中,所有信息都采用二进制编码

  • 编码:用少量简单的基本符号对复杂多样的信息进行一定规律的组合

采用二进制的原因:

  • 制造两个稳态的物理器件容易
  • 二进制编码、计数运算规则简单
  • 对应逻辑命题中的“真”和“假”
  • 便于使用逻辑电路实现算术运算

K位的二进制编码至多表示2k2^k个不同的值

整数的二进制表示

  • 无符号整数
  • 有符号整数:原码,反码,移码,补码

计算中通常使用补码

原码表示:即直接转化为二进制,第一位表示符号位(0正1负),其余位则表示数值大小。

  • 优点:最直接
  • 缺点:0的表示不唯一;加减运算方式不统一,需要对符号位额外处理,不利于硬件设计

补码表示

在一个模运算系统中,一个数与他除以“模”后的余数等价

比如:时钟要从10点拨向6点,既可以逆时针拨4格,也可以顺时针拨8格(10-4=6,同时10+8=18,18模12也为6)

加减的统一:一个负数的补码即为模减去该负数的绝对值,所以一个数减去一个数即为这个数加上这个数的相反数的补码

8位二进制表示:0111 1111 – 0100 0000 = 0111 1111 + (1 0000 0000 – 0100 0000)= 0111 1111 + 1100 0000 == 1 0011 1111 (mod 1 0000 0000)= 0011 1111
(只留余数)

补码的定义:[x]c=(2n+X)mod2n(2nX2n)[x]_c = (2^n+X)mod 2^n (-2^n \leq X \leq 2^n),补码就是一个数加上一个模,然后再总体取这个模的余数

  • 一个二进制数为正数时,补码就是原码;为负数时,补码就是这个数符号位不变,其余位取反+1

补码的优势:补码两个数无论同号还是异号都可以直接相加

移码表示

移码就是将每一个数加上一个偏执常数(bias)

  • 通常当编码位为n时,偏置常数取2n12^{n-1}2n112^{n-1}-1(注意:补码一般在浮点数的阶码部分中使用,在IEEE754中使用的是2n112^{n-1}-1,即127)

  • 此外,全为负数时,移码比原码更容易比较(例如假如有三位,111表示-1,110表示-2,光从数值只能看出111大于110。但是使用移码后双方分别就可以表示为010和001,就可以从移码得到前者大于后者,这也是这两个负数实际的大小情况。)

以八位为例,真值的表示范围:

  • 无符号: 0~255(0 2𝑘10~2^𝑘−1
  • 原码: -127~127(2𝑘1+1 2𝑘11−2^{𝑘−1}+1~2^{𝑘−1} − 1
  • 移码: -127~128 (-2{k-1}+1~2{k-1})
  • 补码: -128127(-2^{k-1}2^{k-1}-1)

浮点数的二进制表示

对比十进制的科学计数法和二进制的科学计数法:

十进制科学计数法:

二进制科学计数法:

规格化数

可以表示为±1.𝑏𝑏𝑏𝑏×2E±1. 𝑏𝑏𝑏 … 𝑏 × 2^E的形式

一般的浮点数分为3个部分:符号位、阶码和尾数

其中,数X就可以表示为(1)S×M×2E(-1)^S \times M \times 2^E

  • E使用是移码,偏置常数通常为127(能够表示指数小于0的数)
  • M为原码(无符号原码乘法运算简单)

IEEE754标准

定义了32位单精度和64位双精度浮点数两种格式

以单精度浮点数为例

  • 如果上面的浮点数表示中的S为1表示负;为0表示正
  • E:全0表示非规格化数;全1表示无穷或非数值NaN;正常情况下范围是00000001(-126)-11111110(127)
  • M:最高位有一个隐藏的1,所以假如M的前三位是456,那么表示的就是1.456

阶码为不同情况下的表示:

非规格化数下,阶码始终为-126,尾数部分最前面的隐藏的1也变成了0,所以非规格化数可以表示为(1)s×0.bbb...×2126(-1)^s \times 0.bbb... \times 2^{-126}

表示浮点数时,如果精度不管怎么办?可以使用舍入原则(根据最后的位数决定最后将最后几位舍去后剩下的值,而不是直接舍去)

二进制编码的十进制表示

浮点运算的问题

  • 精度限制
  • 转换成本高

解决方法:用4位二进制编码十进制(BCD)表示0, 1, …, 9,直接计算

BCD码:使用四位二进制数表示1位十进制数。

自然BCD码(NBCD,8421码)

  • 0到9分别使用0000到1001表示
  • 最前面四位表示符号,1100为正,1101为负

例如:-1265就可以表示为 1101 0001 0010 0110 0101

非数值数据的编码表示

  • 逻辑值:和数值数据在形式上没有差异,指令的操作码就是一种逻辑值,用来识别运算类型
  • 西文字符:有多种不同的字符集,最广泛使用的是ASCII码
  • 汉字字符:一个字就是一个方块原型,至少16位(超过了6万个字符)
  • 多媒体信息(图像、音频等)同样使用0和1表示