From 73eab5a81d502ded0270087898a60e24ae6126ba Mon Sep 17 00:00:00 2001 From: Didnelpsun <2675350965@qq.com> Date: Thu, 20 May 2021 23:53:07 +0800 Subject: [PATCH] Update 1-data-representation-and-operation.md --- .../1-data-representation-and-operation.md | 93 +++++++++++++++++-- 1 file changed, 86 insertions(+), 7 deletions(-) diff --git a/Computer-Organization/1-data-representation-and-operation.md b/Computer-Organization/1-data-representation-and-operation.md index ad391a1..0bbdde4 100644 --- a/Computer-Organization/1-data-representation-and-operation.md +++ b/Computer-Organization/1-data-representation-and-operation.md @@ -285,7 +285,7 @@ k|2|3|4|5|6|7 ### 定点数运算 -#### 移位运算 +#### 定点数移位运算 + 算术移位:通过改变各介数码位和小数点的相对位置,从而改变各数码位的位权。可用移位运算实现乘法、除法。 + 原码的算数移位——符号位保持不变,仅对数值位进行移位: @@ -308,7 +308,7 @@ k|2|3|4|5|6|7 + 带进位位的循环左移:需要加上进位位数值的循环左移。 + 带进位位的循环右移:需要加上进位位数值的循环右移。 -#### 加减运算 +#### 定点数加减运算 + 原码的加减,由加法器和减法器两个硬件来实现,因为最高位为符号位,所以不能直接进行加减: + 原码的加法: @@ -353,7 +353,7 @@ k|2|3|4|5|6|7 + 反码:扩展补1。 + 补码:扩展补0。 -#### 乘法运算 +#### 定点数乘法运算 对于原码的乘数运算可以参考十进制的乘数运算,将乘数一位一位的乘被乘数然后再全部相加得到的就是答案。而使用二进制的一位位乘法显然比十进制的一位位乘更简单。 @@ -421,7 +421,7 @@ k|2|3|4|5|6|7 最后一次不需要移位直接根据辅助位和MQ最后一位判断进行相加。从而让乘数的符号位也参数运算中来确定最后结果的符号。 -#### 除法运算 +#### 定点数除法运算 进行除法操作时,都是为了找到一位能让商乘除数能最大即余数最小但大于0的值。若除数被除数都是小数,可以同时乘一个数变成整数再运算。 @@ -499,13 +499,13 @@ k|2|3|4|5|6|7 原码加减交替法|否|N+1或N+2|左|N|余数的正负|若最终余数为负,需恢复余数 补码加减交替法|是|N+1|左|N|余数和除数是否同号|商末位恒置1 -#### 强制类型转换 +#### 定点数强制类型转换 + 无符号数与有符号数:不改变数据内容,只改变解释方式。 + 长整数转短整数:高位截断,保留低位。 + 短整数转长整数:符号扩展。 -#### 数据存储与排列 +#### 定点数数据存储与排列 + 数据最左边的高位就是最高有效字节MSB。 + 数据最右边的低位就是最低有效字节LSB。 @@ -539,7 +539,7 @@ a的阶码为0,01,是正数,所以补码与原码一样,从数值来看就 + 左规:出现下溢需要左规,即若尾数的高位是无效值(即为0)则会丧失精度,所以我们需要尽可能将尾数多保存一些1,从而让最高位为1。所以需要让数值左移,让小数点右移,尾数算术左移n位,阶码减n,直到尾数最高位是有效值。 + 右规:出现上溢需要右规,规范要求小数点要在第一个非0的数据右边,如果小数点前有超过1个有效位,则需要将数值右移,小数点左移,尾数算术右移n位,阶码加n,直到小数点在尾数最高位的右边。 -**例题** 若a=010;00.1100,b=010;00.1000,求a+b的值。 +**例题** a=010;00.1100,b=010;00.1000,求a+b的值。 已知分号前面的是阶码,后面是尾数,所以a和b都是2的010=2次幂。 @@ -564,9 +564,88 @@ a的阶码为0,01,是正数,所以补码与原码一样,从数值来看就 + 负数为1.0××...×的形式,其最大值表示为1.01...1;最小值表示为1.00..0。(负数的补码1.0xx...x取反后就是1.1xx...x) + 尾数的表示范围为$-1\leqslant M\leqslant-(\dfrac{1}{2}+2^{-n})$。(补码中强制规定1.00...0就代表-1) +**例题** 若某浮点数的阶码、尾数用补码表示,共4+8位:0,110;1.1110100,如何规格化? + +只需要对尾数部分处理,由于负数的补码是1.0开头,而这时是1.1开头,所以必须变成1.0。 + +补码算术左移低位补0,补码算术右移,高位补1。如果是算术右移,则会一直补1,而无法变成1.0开头,所以要使用算术左移,移动三位得到1.0100000,同时阶码减3变为3,最后规格化结果为0,011;1.0100000。 + +对于浮点数,上溢和下溢有正负之分:负上溢<负数区<负下溢<0<正下溢<正数区<正上溢。 + ### IEEE 754标准 +IEEE 754标准就是浮点数标准,为了解决计算机中阶码、尾数使用什么码来表示,各取多少位的问题。 + +#### 移码定义 + ++ 移码的定义其实=真值+偏置值,一般取$2^{n-1}$,这时候移码才等于补码符号位取反,若移码采取其他方案则没有这个特点。 ++ 在IEEE 754标准中,规定移码的偏置值不再是128而是127,即$2^{n-1}-1$。 ++ 从而真值-128的移码为-1000 0000+0111 1111=1111 1111,-127的移码为0000 0000,0的移码为0111 1111,127的移码为1111 1110。 + +#### IEEE 754定义 + ++ 分为数符(表示数值正负号)、阶码(用移码表示)、尾数(用原码表示,且默认最高位为1,实际尾数位都要加1)。 ++ 标准中会将全0的-127和全1的-128做特殊的用途,所以短浮点数的真值正常范围是-126到127。 + +英文类型|中文类型|数符位|阶码位|尾数位|总位数|十六进制偏置值|十进制偏置值 +:------:|:------:|:-----:|:----:|:----:|:----:|:------------:|:----------: +float|短浮点数|1|8|23|32|7FH|127 +double|长浮点数|1|11|52|64|3FFH|1023 +long double|临时浮点数|1|15|64|80|3FFFH|16383 + ++ 令数符为$S$,阶码为$E$,尾数为$M$。 ++ 规格化的短浮点数的真值为$(-1)^S\times 1.M\times2^{E-127}$。 ++ 规格化的长浮点数的真值为$(-1)^S\times 1.M\times2^{E-1023}$。 + +**例题** 将十进制数-0.75转换为IEEE 754的单精度浮点数格式表示。 + +将-0.75D首先转换为二进制为-0.11B,然后规格化变为-1.1B×0.1B。其中阶码为-1(0.1B就是代表2的负一次方)。 + +因为是负数,所以数符为1,尾数部分应该是将1.1B截断隐含的最高位1,所以应该用0.1B表示,即.100...。 + +由于阶码为-1,所以移码=阶码真值+偏置量=-1+111 1111=0111 1110。 + +所以最后就是1 0111 1110 1000 0000 0000 0000 0000 000。 + +**例题** IEEE 754的单精度浮点数C0 A0 00 00H的值是多少。 + +首先是16进制转二进制,每一个十六进制位转换为四个二进制位。所以得到1100 0000 1010 0000 0000 0000 0000 0000。 + +根据IEEE 754标准,将32位分割为数符、阶码、尾数三个部分:数符为1,阶码为100 0000 1,尾数为010 0000 0000 0000 0000 0000。 + +由于尾数最高位隐含为1,所以尾数的真值为1.010 0000 0000 0000 0000 0000。 + +由于数符为1,则这个数表示的是一个负数。 + +由于阶码由移码表示,所以看作无符号数就是129D,而单精度浮点数的偏移量为127D,所以移码真值=移码-偏置量=1000 0001-0111 1111=0000 0010=2。 + +所以浮点数的真值为-1.01B×2×2=-1.25×4=-5。 + +#### IEEE 754取值范围 + +格式|规格化的最小绝对值|规格化的最大绝对值 +:--:|:----------------:|:---------------: +单精度|$E=1$,$M=0$:$1.0×2^{1-127}=2^{-126}$|$E=254$,$M=.11...1$:$1.11...1×2^{254-127}=2^{127}×(2-2^{23})$ +双精度|$E=1$,$M=0$:$1.0×2^{1-1023}=2^{-1022}$|$E=2046$,$M=.11...1$:$1.11...1×2^{2046-1023}=2^{1023}×(2-2^{-52})$ + ++ 对于规格化短浮点数,只有$1\leqslant E\leqslant 254$时,$(-1)^S\times 1.M\times2^{E-127}$。 ++ 当阶码$E$为全0,即应该为-127D,而尾数$M$不全为0时,表示非规格化小数$\pm(0.\textrm{xx...x})_2\times2^{-126}$。(此时最高位就不默认为1了,阶码固定设置为-126)。 ++ 当阶码$E$为全0,即应该为-127D,而尾数$M$全为0时,表示真值$\pm0$,正负看数符。 ++ 当阶码$E$为全1,即应该为-128D,而尾数$M$全为0时,表示无穷大$\pm\infty$,正负看数符。 ++ 当阶码$E$为全1,即应该为-128D,而尾数$M$不全为0时,表示非数值NaN(Not a Number)。如果非法操作如0/0等就会使用到。 + ### 浮点数运算 +#### 浮点数加减运算 + +1. 对阶。 +2. 尾数加减。 +3. 规格化。 +4. 舍入。 +5. 判溢出。 + +#### 浮点数强制类型转换 + + ## 算术逻辑单元