数据的机器级表示
在冯诺依曼结构中,所有信息都采用二进制编码
- 编码:用少量简单的基本符号对复杂多样的信息进行一定规律的组合
采用二进制的原因:
- 制造两个稳态的物理器件容易
- 二进制编码、计数运算规则简单
- 对应逻辑命题中的“真”和“假”
- 便于使用逻辑电路实现算术运算
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
(只留余数)
补码的定义:,补码就是一个数加上一个模,然后再总体取这个模的余数
- 一个二进制数为正数时,补码就是原码;为负数时,补码就是这个数符号位不变,其余位取反+1
补码的优势:补码两个数无论同号还是异号都可以直接相加
移码表示
移码就是将每一个数加上一个偏执常数(bias)
-
通常当编码位为n时,偏置常数取或(注意:补码一般在浮点数的阶码部分中使用,在IEEE754中使用的是,即127)
-
此外,全为负数时,移码比原码更容易比较(例如假如有三位,111表示-1,110表示-2,光从数值只能看出111大于110。但是使用移码后双方分别就可以表示为010和001,就可以从移码得到前者大于后者,这也是这两个负数实际的大小情况。)
以八位为例,真值的表示范围:
- 无符号: 0~255()
- 原码: -127~127()
- 移码: -127~128 (-2{k-1}+1~2{k-1})
- 补码: -128127(-2^{k-1}2^{k-1}-1)
浮点数的二进制表示
对比十进制的科学计数法和二进制的科学计数法:
十进制科学计数法:
二进制科学计数法:
规格化数
可以表示为的形式
一般的浮点数分为3个部分:符号位、阶码和尾数
其中,数X就可以表示为
- 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,所以非规格化数可以表示为
表示浮点数时,如果精度不管怎么办?可以使用舍入原则(根据最后的位数决定最后将最后几位舍去后剩下的值,而不是直接舍去)
二进制编码的十进制表示
浮点运算的问题
- 精度限制
- 转换成本高
解决方法:用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表示