https://gitee.com/fakerlove/computer-organization
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vA4PJ51Z-1609146095500)(picture/20190109141301451.png)]
整数定义
小数定义
正数的原码符号位为0;数值位为其真值
负数的原码符号位为1;数值位为其真值
小数定义
正数的补码符号位为0;数值位为其真值
负数的补码符号位为1;数值位为其真值对应位求反后末位加1
小数定义
正数的补码符号位为0;数值位为其真值
负数的补码符号位为1;数值位为其真值对应位求反
最高位为符号位,书写上~~用“,”(整数)~~或“.”(小数)将数值部分和符号位隔开
对于正数,原码=补码=反码
对于负数,符号位为1,其数值部分原码除符号位外每位按位取反末尾加1→补码 不加一→反码
表示范围
tips:[y]补 连同符号在内,每位取反,末位加1,即得[-y]补
在计算机中,S是小数、可正可负;j是整数、可正可负
表示范围
浮点数(Floating-point Number)是对实数的一种近似表示,由一个有效数字(即尾数)加上幂数来表示,通常是乘以某个基数的整数次幂得到。以这种表示法表示的数值,称为浮点数。表示方法类似于基数为10的科学计数法。利用浮点进行运算,称为浮点计算,这种运算通常伴随着因为无法精确表示而进行的近似或舍入。
计算机对浮点数的表示规范遵循电气和电子工程师协会(IEEE)推出的 IEEE754 标准,浮点数在 C/C++ 中对应 float 和 double 类型,我们有必要知道浮点数在计算机中实际存储的内容。
IEEE754 标准中规定 float 单精度浮点数在机器中表示用 1 位表示数字的符号,用 8 位表示指数,用 23 位表示尾数,即小数部分。对于 double 双精度浮点数,用 1 位表示符号,用 11 位表示指数,52 位表示尾数,其中指数域称为阶码。IEEE754 浮点数的格式如下图所示。
注意,IEE754 规定浮点数阶码 E 采用"指数e的移码-1"来表示,请记住这一点。为什么指数移码要减去 1,这是 IEEE754 对阶码的特殊要求,以满足特殊情况,比如对正无穷的表示。
移码(又叫增码)是对真值补码的符号位取反,一般用作浮点数的阶码,引入的目的是便于浮点数运算时的对阶操作。
对于定点整数,计算机一般采用补码的来存储。正整数的符号位为 0,反码和补码等同于原码。负整数符号位为1,原码、反码和补码的表示都不相同,由原码变成反码和补码有如下规则:
(1)原码符号位为1不变,整数的每一位二进制数位求反得反码;
(2)反码符号位为1不变,反码数值位最低位加1得补码。
比如,以一个字节 8bits 来表示 -3,那么[ − 3 ] 原 = 10000011 [-3]_原=10000011[−3]原=10000011,[ − 3 ] 反 = 11111100 [-3]_反=11111100[−3]反=11111100,[ − 3 ] 补 = 11111101 [-3]_补=11111101[−3]补=11111101,那么 -3 的移码就是[ − 3 ] 移 = 01111101 [-3]_移=01111101[−3]移=01111101。
如何将移码转换为真值 -3 呢?先将移码转换为补码,再求值。
若不对浮点数的表示作出明确的规定,同一个浮点数的表示就不是唯一的。例如( 1.75 ) 10 (1.75)_{10}(1.75)10可以表示成1.11 × 2 0 1.11\times 2^01.11×20,0.111 × 2 1 0.111\times2^10.111×21,0.0111 × 2 2 0.0111\times2^20.0111×22等多种形式。当尾数不为0时,尾数域的最高有效位为1,这称为浮点数的规格化。否则,以修改阶码同时左右移动小数点位置的办法,使其成为规格化数的形式。
IEEE754 标准中,一个规格化的 32 位浮点数 x 的真值表示为:
x = ( − 1 ) S × ( 1. M ) × 2 e x=(-1)S\times(1.M)\times2ex=(−1)S×(1.M)×2e
e = E − 127 e=E-127e=E−127
其中尾数域值是1.M。因为规格化的浮点数的尾数域最左位总是1,故这一位不予存储,而认为隐藏在小数点的左边。
在计算指数 e 时,对阶码E的计算采用原码的计算方式,因此 32 位浮点数的 8bits 的阶码 E 的取值范围是 0 到 255。其中当E为全 0 或者全 1 时,是 IEEE754 规定的特殊情况,下文会另外说明。
64 位的浮点数中符号为 1 位,阶码域为 11 位,尾数域为 52 位,指数偏移值是 1023。因此规格化的 64 位浮点数 x 的真值是:
x = ( − 1 ) S × ( 1. M ) × 2 e x=(-1)S\times(1.M)\times2ex=(−1)S×(1.M)×2e
e = E − 1023 e=E-1023e=E−1023
浮点数阶码E用**“指数e的移码-1”表示,还可以用阶码E的移码(特殊的移码)+阶码E的真值(即指数)**表示。
阶码的移码:假设阶码用8个二进制位表示,则该阶码的移码为 2(n-1) ,但注意这里的移码是特殊的移码,仅偏移2(n-1)-1=127 。
由步骤1可知,符号为 -,故乘积为 -0.10001111
ACC和MQ的前10位为乘积(前2位为符号),故|XY|补=11.01110001,XY=-0.10001111
设 机 器 字 长 为 5 , x = − 0.1101 , y = 0.1011 , 采 用 b o o t h 移 位 原 则 求 x ⋅ y 解 答 [ x ] 补 = 11.0011 , [ − x ] 补 = 00.1101 , [ y ] 补 = 0.1011 乘 数 0.1011 , y 4 为 低 部 分 积 最 后 一 位 , y 5 为 丢 失 位 第 一 位 设机器字长为5,x=-0.1101,y=0.1011 ,采用booth 移位原则求x\cdot y\\ 解答[x]_补=11.0011,[-x]_补=00.1101,[y]_补=0.1011\\ 乘数0.1011 ,y_4为低部分积最后一位,y_5为丢失位第一位 设机器字长为5,x=−0.1101,y=0.1011,采用booth移位原则求x⋅y解答[x]补=11.0011,[−x]补=00.1101,[y]补=0.1011乘数0.1011,y4为低部分积最后一位,y5为丢失位第一位
情况说明 | 操作 | 高部分积 | 低部分积(最后一位为y_n) | 丢失位(第一位为y_n+1) | |
---|---|---|---|---|---|
初 始 值 为 0 初始值为0 初始值为0 | 00.0000 00.0000 00.0000 | 0.101 1 0.101\textcolor{red}1 0.1011 | 0 \textcolor{red}0 0 | y 4 = 1. y 5 = 0 , 加 [ − x ] 补 , 右 移 y_4=1.y_5=0,加[-x]_补,右移 y4=1.y5=0,加[−x]补,右移 | |
加 [ − x ] 补 加[-x]_补 加[−x]补 | 00.0000 + 00.1101 00.0000\\ +\\00.1101 00.0000+00.1101 | = 00.1101 =00.1101 =00.1101 加法后的结果 | 0.1011 0.1011 0.1011 | 0 0 0 | |
右 移 右移 右移 | 00.0110 00.0110 00.0110 | 10.10 1 10.10\textcolor{red}1 10.101 右移了 | 1 0 \textcolor{red}10 10 右移 | y 4 = 1 , y 5 = 1 , 右 移 y_4=1,y_5=1,右移 y4=1,y5=1,右移 | |
右 移 右移 右移 | 00.0011 00.0011 00.0011 | 010.1 0 010.1\textcolor{red}0 010.10 右移 | 1 10 \textcolor{red}110 110 右移了, | y 4 = 0 , y 5 = 1 , 加 [ x ] 补 , 右 移 y_4=0,y_5=1,加[x]_补,右移 y4=0,y5=1,加[x]补,右移 | |
加 [ x ] 补 加[x]_补 加[x]补 | 00.0011 + 11.0011 00.0011\\ +\\11.0011 00.0011+11.0011 | = 11.0110 =11.0110 =11.0110 加法后的结果 | 010.10 010.10 010.10 | 110 110 110 | |
右移 | 11.1011 11.1011 11.1011 | 0010. 1 0010.\textcolor{red}1 0010.1 | 0 110 \textcolor{red}0110 0110 右移了 | y 4 = 1 , y 5 = 0 。 加 [ − x ] 补 , 右 移 y_4=1,y_5=0。加[-x]_补,右移 y4=1,y5=0。加[−x]补,右移 | |
加 [ − x ] 补 加[-x]_补 加[−x]补 | 11.1011 + 00.1101 11.1011\\ +\\ 00.1101 11.1011+00.1101 | 00.1000 00.1000 00.1000 | 0010.1 0010.1 0010.1 | 0110 0110 0110 | |