2019-计算机组织与结构-lecture03
Integer, Floating-point and Decimal Representation
1. 数据的二进制表示
- 为表示出多个数值,必须对多个位进行组合
- 如果有k位,最多能区分2k个不同的值。
- 整数类型:
- 无符号整数:0 - (2k-1)
- 有符号整数:( - 2k-1 - 2k-1-1)
- 原码、反码、补码
- 原码和反码在进行加法运算时都会造成不必要的硬件需求,于是出现了补码
- 二进制补码转换
- 二进制-十进制转换
- 常见问题:
- 只能确定最多表示多少个数,而不能确定具体表示啥。
1.1. 补码
- 可以解决正负数相加减的问题。
- 但是不会影响其加减的运算能力。
- 补码是原码的"取反加一"。
- 为什么会存在补码?
- 比如用钟表表示(-6)-5,可以看成就是把大的数字减去12,得到的即可。
- 接下来类比,我们找到0,按照顺序来排位我们可以知道(1000····0是最最小的),接下来1开头的所有的数字的无符号值,减去2k得到的就是实际的负值。
- 那么接下来如何计算呢?
- x补码+(-x)补码 = 2k
- 证明为什么是取反加一:(-x)补码 = ((2k-1) - x补码) + 1
- 对应取反加一
1.2. 数据移动
- 逻辑左移:右端补充0
- 算术左移:右端补充0
- 逻辑右移:左侧补充0
- 算术右移:左侧补充符号位
1.2.1. 补码的具体计算
- 过程:
- 数值=xk-1*2k-1 + ··· + x1*21+ x0*20 - xk-1*2k(最大值,类比为12)
- = -xk-1*2k-1 + xk-2*2k-2 + ··· + x1*21 + x0*20
- 用数轴来解释,所以是在数轴上平移到右边,所以是取模的操作。
2. 浮点数操作
- 为什么我们需要表示浮点数?
- 除了整数以外,我们还有很多浮点数的操作。
- 规定小数点的位置,小数点的位置可以来区分不同的浮点数,那么我们为什么不使用这样的方法?(定点数)
- 因为这样的话,精度每提高一位,窗口缩小一倍,浮点数表示的范围比较大。
- (-2k-1-(2k-1-1))*2-1
- 为什么浮点数可以表示一个更大的范围?
- 牺牲了比较大的部分的精度。
2.1. 浮点数
- 符号只需要一位。
- 基数是确定的,自己约定好的。
2.2. IEEE754标准
- 固定小数点位数:定下x的小数点位置。
2.2.1. IEEE754标准要求
2.2.2. 计数法约定
- 理论上我们可以表示出来所有的数字,总能移到1出现的位置。
- 偏移量为设定为127,基数设定为2。
2.2.3. 表示范围
- 符号位:正负
- 指数范围:-127-128
- 数值范围:1-(2-2-23)(1.111…1)
- 能表示的数字总数一定为什么表示的范围增大了?
- 稀疏了,在原来的里面变化是均匀的
- 每次E变大的时候,会造成在小的时候的间隔是2-23-127,而在大的时候的间隔是2-23+128
- 为什么这样子表示有意义的?
- 对于一个很大的数,只要能保证一个大致的量即可,比较小的量无关紧要。
- 而对很小的数就有意义。
- 所以在2-1-1.111…1中有223份的每一份,1.111…1和20这个距离是相同的。
- 越靠近0越密
- 问题:存在无法表示的位置,-2-127和2-127无法进行表示。无法表示0。
- 从总体上来讲,这个问题比较小。
- 但是从相邻的2-126中可以看到这是很大的。
- 问题解决:想要表示这些数据,我们就需要牺牲一部分表示别的的数字来表示中间的部分。
2.2.4. 问题解决:表示靠近0的比较小的数字
- 我们使用特殊的规定来表示这样的数字。
- 基数E为0,但是值S不全为0,这部分拿出来,重新布局到-2-126-2-126这部分中去,一共有224-2个元素。
- 这时候我们只要在前面加上0.bbb…b即可,也就是0.bbb…b*2-126
- 这时候我们就需要乘以2-126
- 基数E不为0,S也不为0,是1.bbb…b*2E-127
2.2.5. 问题解决:特别大的数
- 正无穷,负无穷:基数255
2.2.6. 总共能表示的数字的数量
- 232
- -2+1(0)
- -2+2(NaN)
- -(223-1)*2+1(无穷大)
- 总体上比232要小。
2.3. 如何调整后这个模型
- B大一点:会影响精度
- 里面会变密,外面会变稀疏
- 外面会快很多。
- 把指数位变大:棍子会减少
2.4. 扩展版——64位
2.5. 例子
3. 其他的要求存在的问题
- 浮点数在表示比较大的数字的时候,精度比较低。
- 定点数的问题:范围会减少。
- 问题:我们需要比较大的数字,也许要比较高的精度。
3.1. NBCD(W8421)
- 符号位置:
- 1100是正号。或者0
- 1101是负号。或者1
- 好处和优点:
- 十进制和BNCD的转换很自然很准确
- 也支持小数,有几位也都可以
2019-计算机组织与结构-lecture03
https://spricoder.github.io/2020/01/16/2019-COA19/2019-COA19-lecture03/