计算机组成原理——定点数的表示和运算

定点数的表示

1.无符号数和有符号数
计算机中参与运算的有两大类,有符号数和无符号数
无符号数:机器字长全部二进制位均为数值位,没有符号位。
有符号数:在机器中正负号无法识别,所一要专门设置一位符号位来表示正负,一般1表示负,0表示正,通常约定最高位为符号位
2.机器数的定点表示
根据小数点的位置是否改变,计算机中有两种数据模式,定点表示和浮点表示,定点表示约定机器数中的小数位置是不变的,小数点不在使用“.”而是固定在数值位之前(定点小数)或者之后(定点整数)
定点小数:由符号位和数值位构成,第一位为符号位表示正负,符号位后面是小数点(通常隐藏)再后面就是数值位如-0.1定点表示为1.1或11
定点整数:小数点在最后(一般不表示),最高位还是符号位之后便是数值位,如-011011定点整数表示为1011011
在这里插入图片描述

原码,补码,反码,移码

原码:

原码是比较直观的机器数表示法,用机器数的最高位表示该数的符号,其余各位表示数的绝对值。
纯小数的原码:-0.111转换成8位原码后为1.111000,+0.111转换成8位原码后为0.111000
表示范围:如果字长位n+1则原码小数的表示范围为[-(1-2-n), 1-2-n]
纯整数的原码:-111转换成8位原码后为1.0000111,+111转换成8位原码后为0.0000111
表示范围:如果字长位n+1则原码整数的表示范围为[-(2n-1),2n-1]
注意:0的表示方法有两种1000000和0000000
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

反码

正数的反码和原码一样,负数的反码由原码数值位取反得到0的反码不唯一-0反码是1.1111,+0的反码是0.0000
在这里插入图片描述

补码

原码表示的加减法操作比较复杂,对于两个不同符号的加法,要先比较绝对值得大小,然后用绝对值大的减去绝对值小的,最后才能给出适当的符号。而补码的加减法统一为加法操作
当符号位正数的时候,补码和原码一样,如+0.101补码为0.10100000,+1101补码为00001101
当符号为负数的时候,补码等于原码数值位取反加一,如-0.101的补码为原码(1.101)数值位取反(1.010)加一1.011,1.011就是-0.101的补码,-1101的补码为原码(11101)数值位取反(10010)加一10011,10011就是-1101的补码
注意0的补码只有一种表示方式就是0.0000,“-1”的补码不为1.1111定义为“1.0000”
补码的算术移位:补码的符号位和数值位一起右移一位并保持原符号位的值不变,可以实现除法功能(除以2)又称模4补码,双符号位的补码小数00表示正11表示负
在这里插入图片描述

移码

移码就是真值加上一个偏置值,通常偏置值是2的n次方,相当于在真值在数轴上向正方向偏移了若干个单位
特点:
1.移码中0的表示唯一+0=-0=100000
2.一个真值的补码和移码只相差一个符号位
3.移码全为0时,对应真值的最小值-2的n次方,移码全为1时,对应真值的最大值2的n次方-1
4.移码保留了真值原有的大小顺序,移码大真值就大,移码小真值就小
在这里插入图片描述

原码反码补码之间的转换

在这里插入图片描述

各种码的意义

由于计算机的减法器设计起来比较复杂,而且成本比较高,所以在计算机的加减法中,一律将x-x改成x+y,要使这个等式成立,那么就要找到-x对应的y。
在这里插入图片描述
例如:时钟,由于时钟一共只有12个数字,超过了12之后又从1开始循环,这就意味着,我们如果想把10点改成7点,不一定一定要通过-3来实现。还可以通过加9来实现,同理如果计算机中的负数可以通过正数表示,我们就只需要使用一个加法器实现减法操作。
在这里插入图片描述
在这里插入图片描述
在计算机中一个字节的数字有8位,如果超出了这个范围高位就会舍去。低位重新开始循环,既然如此那么任何一个减法操作我们都可以通过加法使数字超过能表示的范围,达到往低位重新计数的效果,也就是可以实现x-x=x+y的效果,发现等价的数之间绝对值之和等于数能表示的范围,这就意味着,我们用数表示的范围减去这个负数的绝对值,我们就能得到他等价的正数,而这个等价的正数就是这个负数的补码,于是我们在计算机的运算中大多都是通过不补码来运算的

移码的作用用于比较大小
在这里插入图片描述

定点数的运算

定点数的移位运算

算术移位

算术运算的对象是有符号数,移位过程中符号位保持不变
对于原码左移一位若不产生溢出,相当于乘以2,右移一位若不考虑舍去末尾数,相当于乘以2。
如果考虑舍弃位的话,右移高位补0,左移低位补0,若舍去数为0则就是除以2和乘以2,但是如果舍弃为是0则会出现精度丢失或者严重误差
在这里插入图片描述
在这里插入图片描述

原码,补码,反码,移码算术移位规则
在这里插入图片描述

负数原码全为0,负数反码全为1,负数补码左0右1

逻辑移位

逻辑移位将操作数看做无符号数,左移和右移都添加0分别舍去低位和高位

循环移位

循环移位分为带标志位CF的大循环和不带标志位CF的小循环,循环移位的主要特点是,移出的数据又被移入数据中,而是否移动进位则要看是否将标志位加入循环,
在这里插入图片描述

原码定点数的加减法

加法规则:先判断符号,若相同则绝对值相加,结果符号位不变,若不同,做减法绝对值大的减绝对值小的,结果符号位与绝对值大的相同
减法规则:两个原码表示的数相减,首先将减数符号取反,然后被减数与符号取反后的减数按照原码加法进行运算。
这种方式在计算机中实现,对硬件的要求太高了,所以一般不使用原码进行加减。
在这里插入图片描述

补码的定点数加减法

补码的加减运算简单,易于实现,所以在计算机中一般采用补码加减运算
1.参与运算的两个操作数均用补码表示
2.按照二进制运算规则,逢二进一
3.符号位与数值位按照同样的规则参与运算,符号位产生的进位需要丢掉,结果的符号位由运算得出
4.补码加减运算一句下面公式进行,
在这里插入图片描述
5.补码的运算结果也为补码
例如
A=13,B=24求A+B和A-B
A补码=00001111
B补码=00011000
-B补码=11101000
A+B的补码=00100111,A+B=+39
A-B的补码=11110111,A-B的原码=10001001,A-B=-9
在这里插入图片描述

溢出的概念和判别方法

溢出是指超出表示范围,通常在两个正数相加,正数减负数超出最大正数范围,两个负数相加,负数减正数低于最小负数的情况下出现。
两个正数相加如果溢出得到的数一定是负数,两个负数相加如果溢出得到的数一定是正数。
在这里插入图片描述

补码判断溢出的方法有三
1.采用一位符号位
由于两个正数相加如果溢出得到的数一定是负数,两个负数相加如果溢出得到的数一定是正数,因此只要参加操作的两符号数相同,结果又与原操作数符号不同,则表示溢出
设置一位符号位V,设A的符号位As,B的符号为Bs,运算结果的符号为Ss,V=As Bs Ss取反+ As取反 Bs取反 Ss V等于0则无溢出,V等于1则溢出,这种方式通过硬件逻辑门电路可以很方便的计算是否溢出。
在这里插入图片描述
2.采用移位符号位根据数据位的进位情况判断
若符号位于最高位的进位相同,则说明没有溢出,否则表示溢出
在这里插入图片描述
3.采用双符号位
符号位采用两位,若11表示正数,00表示负数,参与运算之后如果符号位位01则正溢出,如果为10则负溢出,如果00表示为正没有溢出,如果11表示为负没有溢出。双符号位在存储的时候只占用一个符号位空间(正数为11,负数为00),只有在运算和算术逻辑单元中才分为两个符号位。
在这里插入图片描述

注意:定点运算器中,无论是单符号位还是双符号位,都必有溢出判断电路,一般采用异或门实现

符号扩展

在计算机运算中,有时必须把采用给定位数表示的数转换成具有不同位数的某种表示形式,。例如某个程序需要将一个8位数和另外一个32位数相加,想要得到正确的结果,在将8位数与32位数相加之前,必须将8位数装换成32位数的形式。
正数很好扩展,就是添加的位数全部用0填充。
负数的符号扩展方法根据机器数的不同而不同,
原码表示负数的符号扩展犯法与正数相同,只不过此时的符号位为1
补码的负数符号扩展方法:原有形式的符号位移动到新形式的符号位上,新表示形式所有附加整数位用1填充,小数位用0填充
反码表示负数的扩展方法:原有形式的符号位移动到新形式的符号位上,新表示形式的所有附加为都用1填充
在这里插入图片描述
在这里插入图片描述

定点数的乘法运算

计算机中乘法运算有累加和右移操作来实现,根据机器数的不同,可分原码一位乘法和补码一位乘法。原码一位乘法的规则比补码一位乘法简单
1.原码一位乘法
两个数的符号位通过异或计算,数值部分绝对值相乘
从乘数的最低位开始判断,如果为1则加一个被乘数的绝对值,然后右移一位,如果被乘数为0则直接右移一位,直到判断完所有的乘数
在这里插入图片描述

2.补码一位乘法(Booth)
这是一种有符号数乘法,采用相加和相减操作计算补码数据的乘积
1.符号位参与运算,运算的数均采用补码表示
2.乘数末尾添加一位数初值为0
3.补码的乘法需要在最后一位右边加上一位辅助位,辅助位初始值为0
4.根据最后一位和辅助位的关系判断加什么值(0,x补码,-x补码)乘数的最后两位判断操作方式,如图(高位为最低位,低位为辅助位)
在这里插入图片描述
一共执行n+1个操作,但是最后一次操作不移位,仅做运算。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

定点数的除法运算

1.原码除法运算(不恢复余数法)
符号由两个数的符号求异或得到,数值由两个数的绝对值相除的到
符号位不参与数值运算,用被除数减去除数,当余数为正时,商1,余数和商左移一位,再减去除数,当余数为负时,商0,余数和商左移一位,加上除数,当n+1步余数为负时,需要加上除数的道n+1正确的余数。
在这里插入图片描述
2.补码除法运算(加减交替法)
符号值和数值位一起运算,商符自然形成。第一步通过除数和被除数的符号决定是做加法还是减法,上商的原则根据余数和除数的符号位共同决定,同号商1,异号商0,最后一步商恒值1。
符号位参加计算,除数和被除数均用补码表示,商和余数也用补码表示。
若被除数和除数同号,则被除数减去除数,若被除数和除数异号,则被除数加上除数。
若余数与除数同号,则商1,余数左移一位减去除数,若余数与除数异号,则商上0,余数左移一位加上除数。
若对商没有精度要求,一般采用末位置1
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

C语言中的整数类型及类型转换

在这里插入图片描述

有符号数和无符号数的转换

1.有符号数转无符号数

int main(){
	short x=-4321;
	unsigned short y=(unsigned short)x;
	printf("x=%d,y=%d\n",x,y);
}

x输出为-4321而y输出为61215
short 为有符号数,unsigned为无符号数,有符号数在c语言中通过补码二进制表示,x数据为1110111100011111,无符号数在c语言中通过真值表示,x在转换为无符号数后二进制不变,依然是1110111100011111,输出的y就为61215
2.无符号数转有符号数

int unshort_short(){
    unsigned short x=65535;
    short y=(short)x;
    printf("x=%u,y=%d\n",x,y);
}

65535的真值为1111111111111111,转换为short之后用补码表示11111111111111111,则为-1;

不同字长整数之间的转换

1.大字长转小字长

int int_short(){
    int x=165537,u=-34991;
    short y=(short)x,v=(short)u;
    printf("x=%d,y=%d\n",x,y);
    printf("u=%d,v=%d\n",u,v);
}

int占用字长为4B
short占用字长为2B
所以在大字节转换小字节的过程中直接舍去高位,x=0x000286a1,y=0x68a1,u=0xffff7751,v=0x7751,y=-31071,v=30545
注意:c的char数据属于基本类型,基本类型其中还包括整型,实型,枚举类型!数据在内存中是以二进制形式存放的。数值是以补码表示的。整型:
一个正数的补码和其原码的形式相同。而负数的补码方式是将其绝对值的二进制形式“按位求反再加1”实型:
2.小字长转大字长

int short_int(){
    short x=-4321;
    int y=x ;
    unsigned short u=(unsigned short)x;
    unsigned int v=u;
    printf("x=%d,y=%d\n",x,y);
    printf("u=%u,v=%u\n",u,v);
}

x=0xef1f,y=0xffffef1f
u=0xef1f,u=0000ef1f
低字节向高字节转换时,要补充到高字节的位数,根据符号位补,若符号位为1则全补1,若符号位为0则全补0,注意char类型为8位ASCII码整数,其转换为int时,在高位部分补0即可。

数据的储存和排列

数据的大端方式和小端方式存储

在存储数据时,数据位从低位到高位可以按照从左到右排序,也可以按照从右到左排序,因此无法通过左右判断最高位和最低位,通常最低位由最低有效字节(LSB)表示,最高位由最高有效字节(MSB)表示,现代计算机基本都通过字节编址,每个地址编号中存放1字节,不同类型的数据占用的字节数不同,int和float占用4个字节,double型占用8个字节,一个连续地址编号,从左到右一次增大为大端方式,从做到右依次减小为小端方式
在这里插入图片描述
在这里插入图片描述

数据按‘边界对齐’方式存储

假设存储字长为32位,可按字节,半字节和字来寻址,数据以边界对齐方式存放,半字地址一定是2的整数倍,字节一定是4的整数倍,这样无论是索取的数据是字节,半字,还是字,均可一次访存取出,当不满足上述要求时,通过填充空白字节使其符合要求。虽然浪费了存储空间,但是可以提高取指令和取数的速度

在这里插入图片描述

真题

2019:FFFFFFFFH-FFFFFFF0H 进位/借位标志和溢出标志为多少,FFFFFFFFH大于FFFFFFF0H所以不会产生借位,两个都是负数,负数减负数也不会溢出所以进位/借位标志和溢出标志都为0;

2016:无符号数的补码和原码相同

2014:定点补码负数比正数多表示一位

  • 7
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值