补码运算规则

补码运算规则
补码运算规则

补码(two's complement)

在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值位统一处理;同时,加法和减法也可以统一处理。此外,补码与原码的的相互转换,其运算过程是相同的,不需要额外的硬件电路。

补码的特性

1、一个整数(或原码)与其补数(或补码)相加,和为模。

2、对一个整数的补码再求补码,等于该整数自身。

3、补码的正零与负零表示方法相同。

机器数:计算机中参与运算的数被称为机器数,有以下特点,

1、计算机中参与运算的数均为二进制数,这是因为,运算电路是由只能识别“0”、“1”的数字电路组成。

2、机器数有带符号数和无符号数两种。

3、带符号的机器数有源码、反码和补码三种表示方式;无符号数没有源码、反码、补码的区别。

4、CPU的运算电路是按补码的运算规律设计,因此,进行运算的带符号数均用补码表示。

无符号数的运算

1、与手工二进制运算的方法相同(指运算电路)。

2、可以用十六进制数的运算代替二进制数的运算,计算时不容易出错,而且快捷。

源码表示法(带符号数)

1、正数。最高位是符号位,用“0”表示正号,即15~0位的第15位为0,7~0位的第7位为0。

2、负数。最高位是符号位,用“1”表示负号,即15~0位的第15位为1,7~0位的第7位为1。

3、求源码的方法:先将真值转换成二进制数,再写成固定的8位或16位,最高位用“0”或“1”表示数的正号和负号。计算机就是用这种方法表示。

真值就是带符号的十进制数(补码的绝对值),如+20、-20、+120、-120。在计算机内,如果是一个二进制数,其最左边的位是1,则我们可以判定它为负数,并且是用补码表示。若要得到一个负二进制补码的真值(原来的数值),只要对其求补码,就可得到真值。

【例5】-65的补码是10111111

若直接将10111111转换成十进制,发现结果并不是-65,而是191。

各位取反(除符号位):11000000,再+1:11000001(-65)

反码表示法(带符号数)

1、正数。源码等于反码。

2、负数。源码的最高位“1”不变,数值部分“1”变“0”,“0”变“1”。

3、求反码的方法:正数不用求反码,正数的源码就是反码。负数的反码是以负数的源码再求反码。

补码表示法(带符号数)

1、正数。源码等于补码。

2、负数。反码的最高位“1”不变,数值部分+1。

求补码的方法。正数的源码等于补码。负数的补码是以该负数的源码求反码然后再+1获得。同一个数字在不同的补码表示形式中是不同的。比如-15的补码,在8位二进制中是11110001,然而在16位二进制补码表示中,就是1111111111110001。以下都使用8位2进制来表示。

【例】求-5的补码。

因为给定数是负数,则符号位为“1”。

后七位:-5的原码(10000101)→符号位不变(10000101)→数值位取反(11111010)→加1(11111011)

所以-5的补码是11111011。

【例】数0的补码表示是唯一的。

[+0]补=[+0]反=[+0]原=00000000

[ -0]补=11111111+1=00000000

补码转化为原码

已知一个数的补码,求原码的操作其实就是对该补码再求补码:

⑴如果补码的符号位为“0”,表示是一个正数,其原码就是补码。

⑵如果补码的符号位为“1”,表示是一个负数,那么求给定的这个补码的补码就是要求的原码。

【例】已知一个补码为11111001,则原码是10000111(-7)。

因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”。

其余七位1111001取反后为0000110;

再加1,所以是10000111。

补码的运算(带符号数)

补码的运算原理:计算机中的CPU仅有加法电路,没有减法电路。采用补码运算的目的,是将减法变为加法。同时,补码运算将符号位视为数共同参与运算,

其结果仍然不会出错。但是,补码运算的条件是运算器有固定的容量,即“模”。

“模”是指一个计量系统的计数范围。如时钟等。计算机也可以看成一个计量机器,它也有一个计量范围,即都存在一个“模”。表示n位的计算机计量范围是0~2^n-1,模=2^n(2^n表示将2的n次方)。

例如,两位十进制计数器,它的计数容量是00~99,模=100

时钟的计数容量是0~11,模=12

“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。任何有模的计量器,均可化减法为加法运算。

例如:假设当前时针指向10点,而准确时间是6点,调整时间可有以下两种拨法:一种是倒拨4小时,即:10-4=6;另一种是顺拨8小时:10+8=12+6=6

在以12模的系统中,加8和减4效果是一样的,因此凡是减4运算,都可以用加8来代替。对“模”而言,8和4互为补数。实际上以12模的系统中,11和1,10和2,9和3,7和5,6和6都有这个特性。共同的特点是两者相加等于模。

对于计算机,其概念和方法完全一样。n位计算机,设n=8,所能表示的最大数是11111111,若再加1成为100000000(9位),但因只有8位,最高位1自然丢失。又回了00000000,所以8位二进制系统的模为2^8。在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以了。把补数用到计算机对数的处理上,就是补码。

另外两个概念:

一的补码(one's complement) 指的是正数=原码,负数=反码

二的补码(two's complement) 指的就是通常所指的补码。

1、补码的加法。两个补码相加,算法与二进制加法相同,也可以用十六进制数相加。注意:和仍然是一个补码,符合补码定义。

[X+Y]补= [X]补+ [Y]补

【例6】X=+0110011, Y=-0101001,求[X+Y]补

[X]补=00110011 [Y]补=11010111

[X+Y]补= [X]补+ [Y]补= 00110011+11010111=00001010

注:因为计算机中运算器的位长是固定的(定长运算),上述运算中产生的最高位进位将丢掉,所以结果不是100001010,而是00001010,。

2、验算结果。由补码求真值的方法:先求出补码对应的源码,再求出真值。对X的补码再进行求补码运算,就得到X的源码。

从补码求源码的方法:正数不用求源码,源码等于补码。负数的补码符号位不变,数值部分按位取反,然后再+1,得到源码。

注意:由真值求补码或由补码求真值的方法,都必须用二进制数表示才能进行。

补码的减法。计算机不能做减法,采用的方法是对减数进行进行变补,再与被减数相加实现的。变补运算的方法:连同符号位一同取反+1。

[X-Y]补= [X]补- [Y]补= [X]补+ [-Y]补【1】

【1】在上一个版本中有如下说明:

“其中[-Y]补称为负补,求负补的方法是:负数的绝对值的原码所有位按位取反;然后整个数加1。(恢复本来解释。请路人真正理解并实际验证后再修改。以免误导大众。另外,例6不具典型性,新增例7。)”

私以为,不必要提出负补的概念以使问题复杂化,尽管该解法是正确的,但却完全没有必要增加新的运算方法及运算结构。求[-Y]补,只需,先将符号位取反,求出-Y,再求-Y的补码即可。尽管这与求负补的方法实际上是一致的,但是却简化了概念,仅仅是对过去概念以及运算结构的复用。

相应的,原例7(现例8)重新作了修改。

【例7】1-1 [十进制]

1的原码00000001 转换成补码:00000001

-1的原码10000001 转换成补码:11111111

1+(-1)=0

00000001+11111111=00000000

00000000转换成十进制为0

0=0所以运算正确。

【例8增】-7-(-10) [十进制]

改为加法形式:-7-(-10)=-7+(-(-10))

-7的补码:11111001

-(-10)的补码:-10的原码为10001010,-(-10)的原码为00001010,

-(-10)的补码就是其原码,为00001010

-7 - (-10)= -7 + 10 = 3

11111001+00001010 = 00000011

转换成十进制为3

3、

手工算法:直接减。不论被减数是大于、等于或小于减数,均用被减数减去减数。当被减数小于减数时,直接向高位借位,结果仍然正确,而且是一个补码。

例:(-64)-(+20)=(-64)+(-20)= -84

(+20)-(-64)=(+20)+(+64)= +84

带符号数补码的范围

1、8位带符号数补码的范围:-128~+127,80H~7FH或0X80~0XFF。

2、16位带符号数补码的范围:-32768~+32767,8000H~7FFFH或0X8000~0X7FFF。

不带符号数补码的范围

1、8位不带符号数补码的范围:0~+255,00H~FFH或0X00~0XFF。

2、16位不带符号数补码的范围:0~+65535,0000H~FFFFH或0X0000~0XFFFF。

代数解释

在十进制中我们可以把n位二进制体系中的数a表示为:

求补码,意味着求:而根据等比数列求和公式:

因为这里k0,k1,k2,k3……不是0就是1,所以1-k0,1-k1,1-k2的运算就是二进制下的取反

注:n位二进制,最高位为符号位,因此表示的数值范围-2^(n-1) ——2^(n-1) -1,所以模为2^(n-1)。上面提到的8位二进制模为2^8是因为最高位非符号位,表示的数值范围为0——2^8-1。

补码总结

补码只是一种相对合理的编码方案。这个方案在负数的机器表示中解决了3个问题:

1、数的表示:在数的表示上通过人为的定义来消除编码映射的不唯一性,对转换后的10000000强制认定为-128。当然对原码和反码也可以做这种强制认定,那为什么原码和反码没有流行起来?

2、数的运算:原码和反码没有流行起来,是因为在数的运算上对符号位的处理无法用当时已有的机器物理设计来实现,由于原码和反码在编码时采用了硬性的人工设计,这种设计在数理上无法自动的通过模来实现对符号位的自动处理,符号位必须人工处理,必须对机器加入新的物理部件来专门处理符号位,这加大了机器设计难度,加大的机器成本,不到万不得已,不走这条路。设计补码时,有意识的引用了模运算在数理上对符号位的自动处理,利用模的自动丢弃实现了符号位的自然处理,仅仅通过编码的改变就可以在不更改机器物理架构的基础上完成的预期的要求,所以补码沿用至今。

3、自身逻辑意义的完整性:补码这个编码方案要解决的是如何在机器中表示负数,其本质意义为用一个正数来表示这个正数对应的负数。所谓-20的补码是指:如何在机器中用补码形式表示-20。具体过程是这样的:将20的二进制形式直接写出00010100,然后所有位取反变成11101011,再加1变成了11101100。最简单的补码转换方式,不必去理会转换过程中的符号位,只关注转换前和最终转换后的符号位就行了。

那么对11101100求出其补码又具有什么现实含义呢?对一个数求补,逻辑过程是对这个数的所有的二进制位按位取反再加1。现实含义是求出这个数对应的负

数形式。对11101100求补就是求出这个数对应的负数的形式,直接操作下11101100,先所有位取反00010011,再加上1就成了00010100。对11101100求出其补码的含义:11101100按照现行补码码制表示的有符号数是-20,对于-20求补就是求出其对应的负数-(-20),现实中-(-20)是+20,那么求补运算的结果符合现实情况吗,00010100转换成有符号数正是+20,这就说明了补码自身逻辑意义是完整的,是不会自相矛盾的。

最后,补码的总前提是机器数,不要忘了机器数的符号位含义,最高位为0表示正数,最高位为1表示负数,而最高位是指机器字长的最左边一位。字节数100B,最高位为00000100中的最左边的0。

补码的绝对值 补码的运算

(3).补码的绝对值(称为真值) 【例4】-65的补码是10111111 若直接将10111111转换成十进制,发现结果并不是-65,而是191。事实上,在计算机内,如果是一个二进制数,其最左边的位是1,则 我们可以判定它为负数,并且是用补码表示。若要得到一个负二进制数的绝对值(称为真值),只要各位(包括符号位)取反,再加1,就得到真值。如:二进制值:10111111(-65的补码)各位取反:01000000 加1:01000001(+65的补码) 编辑本段代数加减运算 1、补码加法 [X+Y]补 = [X]补 + [Y]补【例5】X=+0110011,Y=-0101001,求[X+Y]补[X]补=00110011 [Y]补=11010111 [X+Y]补 = [X]补 + [Y]补 = 00110011+11010111=00001010 注:因为计算机中运算器的位长是固定的,上述运算中产生的最高位进位将丢掉,所以结果不是100001010,而是00001010。 2、补码减法 [X-Y]补 = [X]补 - [Y]补 = [X]补 + [-Y]补其中[-Y]补称为负补,求负补的方法是:所有位(包括符号位)按位取反;然后整个数加1。【例6】1+(-1) [十进制] 1的原码00000001 转换成补码:00000001 -1的原码10000001 转换成补码:11111111 1+(-1)=0 00000001+11111111=00000000 00000000转换成十进制为0 0=0所以运算正确。 3、补码乘法 设被乘数【X】补=X0.X1X2……Xn-1,乘数【Y】补=Y0.Y1Y2……Yn-1, 【X*Y】补=【X】补×【Y】补,即乘数(被乘数)相乘的补码等于补码的相乘。 编辑本段补码的代数解释 任何一个数都可以表示为-a=2^(n-1)-2^(n-1)-a; 这个假设a为正数,那么-a就是负数。而根据二进制转十进制数的方法,我们可以把a表示为: a=k0*2^0+k1*2^1+k2*2^2+……+k(n-2)*2^(n-2) 这里k0,k1,k2,k(n-2)是1或者0,而 且这里设a的二进制位数为n位,即其模为2^(n-1),而2^(n-1)其二项展开 是:1+2^0+2^1+2^2+……+2^(n-2),而式子:-a=2^(n-1)-2^(n-1)-a中,2^(n-1)-a代入 a=k0*2^0+k1*2^1+k2*2^2+……+k(n-2)*2^(n-2)和2^(n-1)=1+2^0+2^1+2^2+……+2^(n-2) 两式,2^(n-1)-a=(1-k(n-2))*2^(n-2)+(1-k(n-3))*2^(n-3)+…… +(1-k2)*2^2+(1-k1)*2^1+(1-k0)*2^0+1,而这步转化正是取反再加1的规则的代数原理所在。因为这里k0,k1,k2,k3……不是0就是1,所以1-k0,1-k1,1-k2的运算就是二进制下的 取反,而为什么要加1,追溯起来就是2^(n-1)的二项展开式最后还有一项1的缘故。而 -a=2^(n-1)-2^(n-1)-a中,还有-2^(n-1)这项未解释,这项就是补码里首位的1,首位1在

有关补码的知识及运算规则

1.第一篇 数值在计算机中表示形式为机器数,计算机只能识别0和1,使用的是二进制,而在日常生活中人们使用的是十进制,"正如亚里士多德早就指出的那样,今天十进制的广泛采用,只不过我们绝大多数人生来具有10个手指头这个解剖学事实的结果.尽管在历史上手指计数(5,10进制)的实践要比二或三进制计数出现的晚."(摘自<<数学发展史>>有空大家可以看看哦~,很有意思的).为了能方便的与二进制转换,就使用了十六进制(2 4)和八进制(23).下面进入正题. 数值有正负之分,计算机就用一个数的最高位存放符号(0为正,1为负).这就是机器数的原码了.假设机器能处理的位数为8.即字长为1byte,原码能表示数值的范围为 (-127~-0 +0~127)共256个. ? 有了数值的表示方法就可以对数进行算术运算.但是很快就发现用带符号位的原码进行乘除运算时结果正确,而在加减运算的时候就出现了问题,如下: 假设字长为8bits ( 1 )?10-? ( 1 )10?=? ( 1 )10?+ ( -1 )10?= ?( 0 )10 (00000001)原?+ (10000001)原?= (10000010)原?= ( -2 )?显然不正确. ? 因为在两个整数的加法运算中是没有问题的,于是就发现问题出现在带符号位的负数身上,对除符号位外的其余各位逐位取反就产生了反码.反码的取值空间和原码相同且一一对应. 下面是反码的减法运算: ?( 1 )10?-? ( 1 )?10=? ( 1 )?10+ ( -1 )?10= ?( 0 )10 ?(00000001)?反+ (11111110)反?=? (11111111)反?=? ( -0 ) ?有问题. ( 1 )10?-? ( 2)10?=? ( 1 )10?+ ( -2 )10?= ?( -1 )10 (00000001)?反+ (11111101)反?=? (11111110)反?=? ( -1 )?正确 问题出现在(+0)和(-0)上,在人们的计算概念中零是没有正负之分的.(印度人首先将零作为标记并放入运算之中,包含有零号的印度数学和十进制计数对人类文明的贡献极大). 于是就引入了补码概念. 负数的补码就是对反码加一,而正数不变,正数的原码反码补码是一样的.在补码中用(-128)代替了(-0),所以补码的表示范围为:

原码、反码与补码知识讲解

2.2 原码、反码与补码 在计算机内的数(称之为“机器数”)值有3种表示法:原码、反码和补码。所谓原码就是带正、负号的二进制数,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。由此可见,这三种表示法中,关键是负数的表示方式不一样。 2.2.1 正负数表示、定点数与浮点数 在计算机内,通常把1个二进制数的最高位定义为符号位,用“0”表示正数,“1”表示负数;其余位表示数值。 规定小数点位置固定不变的数称为“定点数”;小数点的位置不固定,可以浮动的数称为“浮点数”。 2.2.2 原码 原码表示法是定点数的一种简单的表示法。用原码表示带符号二进制数时,符号位用0表示正,1表示负;数值位保持不变。原码表示法又称为符号-数值表示法。 1. 小数原码表示法 设有一数为x,则原码表示可记作[x]原(下标表示)。例如,X1= +1010110 ;X2= -1001010 原码表示数的范围与二进制位数有关。设二进制小数X=±0.X1X2…Xm,则小数原码的定义如下: 例如:X=+0.1011时,根据以上公式可得[X]原=0.1011;X=-0.1011时,根据以上公式可得[X]原= 1-(-0.1011)=1.1011=1.1011 当用8位二进制来表示小数原码时,其表示范围为:最大值为0.1111111,其真值约为(0.99)10 ;最小值为1.1111111,其真值约为(-0.99)10。根据定义,小数“0”的原码可以表示成0.0…0或1.0…0。 2. 整数原码表示法 整数原码的定义如下: 例如:X=+1101时,根据以上公式可得[X]原=01101;X=-1101时,根据以上公式可得[X]原=24-(-1101)=10000+1101=11101 当用8位二进制来表示整数原码时,其表示范围为:最大值为01111111,其真值为(127)10 ;最小值为11111111,其真值为(-127)10 。同样,整数“0”的原码也有两种形式,即00…0和10…0。 2.2.3 反码 用反码表示带符号的二进制数时,符号位与原码相同,即用0表示正,用1表示负;数值位与符号位相关,正数反码的数值位和真值的数值位相同;而负数反码的数值位是真值的数值位按位变反。 1. 小数反码表示法 设二进制小数X=±0.x1x2…xm,则其反码定义为: 例如,X=+0.1011时,根据以上公式可得[X]反=0.1011;当X=-0.1011时,根据以上公式可得[X]反=2-2-4+X=10.0000-0.0001-0.1011=1.0100。根据定义,小数“0”的反码有两种表示形式,即0.0…0和1.1…1。 2. 整数反码表示法 设二进制整数X=±Xn-1Xn-2…X0,则其反码定义为: 例如,X=+1001时,根据以上公式可得[X]反= 01001;当X=-1001时,根据以上公式可得[X]反= (25-1)+X= (100000-1)+(-1001)= 11111-1001=10110 同样,整数“0”的反码也有两种形式,即00…0和11…1。

补码运算加减乘除原理

首先我们来看为什么要使用补码运算法: 因为人脑可以知道第一位是符号位, 在计算的时候我们会根据符号位, 选择对真值区域的加减. (真值的概念在本文最开头). 但是对于计算机, 加减乘数已经是最基础的运算, 要设计的尽量简单. 计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂! 于是人们想出了将符号位也参与运算的方法. 我们知道, 根据运算法则减去一个正数等于加上一个负数, 即: 1-1 = 1 + (-1) = 0 , 所以机器可以只有加法而没有减法, 这样计算机运算的设计就更简单了. 于是人们开始探索将符号位参与运算, 并且只保留加法的方法. 首先来看原码: 计算十进制的表达式: 1-1=0 1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2 如果用原码表示, 让符号位也参与计算, 显然对于减法来说, 结果是不正确的.这也就是为何计算机内部不使用原码表示一个数. 为了解决原码做减法的问题, 出现了反码: 计算十进制的表达式: 1-1=0 1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0 发现用反码计算减法, 结果的真值部分是正确的. 而唯一的问题其实就出现在"0"这个特 殊的数值上.虽然人们理解上+0和-0是一样的, 但是0带符号是没有任何意义的. 而且会有[0000 0000]原和[1000 0000]原两个编码表示0. 于是补码的出现, 解决了0的符号以及两个编码的问题: 1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原 这样0用[0000 0000]表示, 而以前出现问题的-0则不存在了.而且可以用[1000 0000]表示-128: 接下来我们来看补码运算原理: 在计算机里,如果我们要计算5-3的值,我们既可以用5减去3,也可以用5 加上13。这是为什么呢? 这就像我们的钟表,它从1点走到12点之后,又回到了1点。我们的计算机 也是,从0走到15之后,再往下走就又回到了0,就像我们转了一个圈一样。 我们从5这个位置往回退3个格,就完成了5-3这个计算。我们也可以从5这 个位置往前走,一直走到15,这时我们走了10个格,然后我们继续往前走, 走到0,然后到1,然后就走到了2。这样,我们往前走了13个格之后,也到 了2这个位置。 所以说,在我们这个计算机中,减3和加13是一样的。而3+13=16,我们说在 模16的系统下,3和13是互补的。 这样,我们计算5-3就可以换成5+13。3的二进制表示为0011,5的二进制表 示为0101。这样,0101-0011就可以表示为0101+(-0011)。 我们在计算机中都是把负数用其补码表示,-0011的补码就是10000-0011(即 16-3,也就是13)。10000-0011=1+1111-0011=1+(1111-0011)=1+1100=1101。

原码-反码-补码及运算

原码,反码,补码及运算 一、定义 1.原码 正数的符号位为0,负数的符号位为1,其它位按照一般的方法来表示数的绝对值。用这样的表示方法得到的就是数的原码。 【例2.13】当机器字长为8位二进制数时: X=+1011011 [X]原码=01011011 Y=-1011011 [Y]原码=11011011 [+1]原码=00000001 [-1]原码=10000001 [+127]原码=01111111 [-127]原码=11111111 原码表示的整数范围是: -(2n-1-1)~+(2n-1-1),其中n为机器字长。 则:8位二进制原码表示的整数范围是-127~+127 16位二进制原码表示的整数范围是-32767~+32767 2.反码 对于一个带符号的数来说,正数的反码与其原码相同,负数的反码为其原码除符号位以外的各位按位取反。 【例2.14】当机器字长为8位二进制数时: X=+1011011 [X]原码=01011011 [X]反码=01011011 Y=-1011011 [Y]原码=11011011 [Y]反码=10100100 [+1]反码=00000001 [-1]反码=11111110 [+127]反码=01111111 [-127]反码=10000000 负数的反码与负数的原码有很大的区别,反码通常用作求补码过程中的中间形式。

反码表示的整数范围与原码相同。 3.补码 正数的补码与其原码相同,负数的补码为其反码在最低位加1。 引入补码以后,计算机中的加减运算都可以统一化为补码的加法运算,其符号位也参与运算。 【例2.15】(1)X=+1011011 (2) Y=-1011011 (1)根据定义有: [X]原码=01011011 [X]补码=01011011 (2)根据定义有: [Y]原码=11011011 [Y]反码=10100100 [Y]补码=10100101 补码表示的整数范围是-2n-1~+(2n-1-1),其中n为机器字长。 则:8位二进制补码表示的整数范围是-128~+127(-128 表示为10000000,无对应的原码和反码) 16位二进制补码表示的整数范围是-32768~+32767 当运算结果超出这个范围时,就不能正确表示数了,此时称为溢出。 所以补码的设计目的是: ⑴使符号位能与有效值部分一起参加运算,从而简化运算规则. ⑵使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计

计算机组成原理实验报告-八位补码加减法器的设计与实现

计算机科学与技术学院 计算机组成原理 实验报告书 实验名称八位补码加/减法器的设计与实现班级 学号 姓名 指导教师 日期 成绩

实验1八位补码加/减法器的设计与实现 一、实验目的 1.掌握算术逻辑运算单元(ALU)的工作原理。 2.熟悉简单运算器的数据传送通路。 3.掌握8位补码加/减法运算器的设计方法。 4.掌握运算器电路的仿真测试方法 二、实验任务 1.设计一个8位补码加/减法运算器 (1)参考图1,在QUARTUS II里输入原理图,设计一个8位补码加/减法运算器。 (2)创建波形文件,对该8位补码加/减法运算器进行功能仿真测试。 (3)测试通过后,封装成一个芯片。 2.设计8位运算器通路电路 参考下图,利用实验任务1设计的8位补码加/减法运算器芯片建立运算器通路。 3.利用仿真波形,测试数据通路的正确性。 设定各控制信号的状态,完成下列操作,要求记录各控制信号的值及时序关系。 (1)在输入数据IN7~IN0上输入数据后,开启输入缓冲三态门,检查总线BUS7~BUS0上的值与IN0~IN7端输入的数据是否一致。 (2)给DR1存入55H,检查数据是否存入,请说明检查方法。 (3)给DR2存入AAH,检查数据是否存入,请说明检查方法。 (4)完成加法运算,求55H+AAH,检查运算结果是否正确,请说明检查方法。 (5)完成减法运算,分别求55H-AAH和AAH-55H,检查运算结果是否正确,请说明检查方法。 (6)求12H+34H-56H,将结果存入寄存器R0,检查运算结果是否正确,同时检查数据是否存入,请说明检查方法。 三、实验要求 (1)做好实验预习,掌握运算器的数据传送通路和ALU的功能特性。 (2)实验完毕,写出实验报告,内容如下: ①实验目的。 ②实验电路图。 ③按实验任务3的要求,填写下表,以记录各控制信号的值及时序关系。 表中的序号表示各控制信号之间的时序关系。要求一个控制任务填一张表,并 可用文字对有关内容进行说明。

补码的计算方法

补码: 已知十进制,求二进制 求正整数转二进制 除2取余,直至商为0,余数倒叙排列 求负整数转二进制 先求与该负数相对应的正整数的二进制代码,然后将 所有位取反,末位加1,不够位数时,左边补1. 比如 -3的二进制: 1)3的二进制数是011; 2)所有位取反,得到100; 3)末位加1,得到101; 4)32位机器上,位数不够,左边补齐29个1;即1111 (11111) 101。即FFFFFFFD。 已知二进制,求十进制 如果首位为0,则表明是正整数,按普通方法来求 如果首位为1,则表明是负整数 将所有位取反,末位加1,所得数字就是该负数的绝对值。 比如求1111001001对应的十进制数: 1)所有位取反,得到0000110101; 2)末位加1,得到110110; 3)110110对应的十进制数为52,即原数字对应的十进制数为-54 如果全是零,则对应的十进制数字就是零。 思考题: 1.8位CPU,int类型的变量所能存储的数字的范围是多少? 0000 0000 ->0 //0 0000 0001 ->1 ……

…… 0111 1110 ->126 0111 1111 —>127 //最大正数 1000 0000 ->-128 //最小负数绝对值最大的负数 1000 0001 ->-127 1000 0010 ->-126 …… …… 1111 1110 ->-2 1111 1111 ->-1 //最大负数 //8位CPU,int类型的变量,所能存储的数字范围是-128~127 //由此,可扩展到32位CPU,int类型的变量的最大正整数是7FFFFFFF 最大负整数是80000000 2.数字超过最大正数会怎样? 首先,超过最大正数时,对应的二进制代码会变成负数,如果进一步增大,数字就会溢出,超过计算范围。 比如,8位CPU,最大正整数是0111 1111,如果写了个128,二进制代码会变为1000 0000,此时,结果变味负 值,如果继续增大,最终将会溢出。

补码计算

?补码 补码举例 补码(two's complement) 1、在计算机系统中,数值一律用补码来表示(存储)。 主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补 码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。 2、补码与原码的转换过程几乎是相同的。 [ 转自铁血社区https://www.360docs.net/doc/d711548458.html,/ ] 求给定数值的补码表示分以下两种情况: (1)正数的补码:与原码相同。 [例1]+9的补码是00001001。 (2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。 [例2]求-7的补码。 因为给定数是负数,则符号位为“1”。 [ 转自铁血社区https://www.360docs.net/doc/d711548458.html,/ ] 后七位:+7的原码(0000111)→按位取反(1111000)→加1(1111001) 所以-7的补码是11111001。 已知一个数的补码,求原码的操作分两种情况: (1)如果补码的符号位为“0”,表示是一个正数,其原码就是补码。 (2)如果补码的符号位为“1”,表示是一个负数,那么求给定的这个补码的补码就是要求的原码。 [例3]已知一个补码为11111001,则原码是10000111(-7)。 [ 转自铁血社区https://www.360docs.net/doc/d711548458.html,/ ] 因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”。 其余七位1111001取反后为0000110; 再加1,所以是10000111。 在“闲扯原码、反码、补码”文件中,没有提到一个很重要的概念“模”。我在这里稍微介绍一下“模” 的概念: “模”是指一个计量系统的计数范围。如时钟等。计算机也可以看成一个计量机器,它也有一个计量范 [ 转自铁血社区https://www.360docs.net/doc/d711548458.html,/ ] 围,即都存在一个“模”。例如: 时钟的计量范围是0~11,模=12。 表示n位的计算机计量范围是0~2^(n)-1,模=2^(n)。 “模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只

二进制补码运算

课题三二进制补码运算 下面我们主要介绍在原码与补码运算中应注意的问题。 在原码运算时,首先要把符号与数值分开。例如两数相加,先要判断两数的符号,如果同号,可以做加法,如果异号,实际要做减法,减后的差作为两数之和,和数的符号与绝对值较大的数的符号相同。两数相减也是一样,首先要判断两数符号,然后决定是相加还是相减,还要根据两数的大小与符号决定两数之差的符号。 如果是补码运算则不存在符号与数值分开的问题。在补码运算时,把符号位也看成数值,一起参加运算,而且加法运算就一定是相加,减法运算就一定是相减,因此在计算机中对带符号的数进行加减时,最好使用补码。 补码的运算规则是:X补+Y补=(X+Y)补 设有两个数x和y,x=-89,y=+18,用补码表示如下 x=10100111B (-89的补码) y=00010010B (+18的补码) 若求x+y之和,可不用考虑两数的符号,直接相加,得出的和为x+y=11000111B(-71的补码),可见直接相加结果是正确的。 (列出算式) 若求x-y之差,也可以直接相减,即 x=101001l1B (-89的补码) -y=00010010B (+18的补码) x-y=10010101B (-107的补码) 可见直接相减结果也是正确的。

若求y-x之差,同样也用减法,即 y=00010010B (+18的补码) -x=10100111B (-89的补码) 也就是说做减法时,不论两数符号如何,其相减结果不论是数值还是符号都是正确的。 在上述y-x算式中,最高位发生的进(借)位只是因为在字长为8位的计算机中,若运算结果并未超出补码的记数范围(-128~+127),这时的进(借)位被视为自然丢弃。计算机在运算中,这种自然丢弃并不影响结果的正确性。 但要注意,如果字长为8位的计算机,其计算结果超过8位补码所允许的表示范围(即超出-128~+127),则其进位称之为溢出。溢出和自然丢弃是两种不同的概念。判别属于哪一种,则要看计算结果第7位与第8位的进位情况,如果第7位和第8位同时产生进位,即所谓双进位,则这种进位属于允许的自然丢弃。如果只有第7位或者只有第8位产生进位,即只有单进位,则这种进位属于溢出,溢出表示其数值超出计算机字长所能表示的范围,运算结果必然是错误的,因而也是不允许的。 应当注意的是,溢出的概念主要是指带符号二进制数进行加减运算时可能产生的一种结果。对于无符号数,第8位不是符号位,只有第8位的进位才称为进位,而不采用溢出这个概念。 对于无符号数的运算还应注意一点,当两个无符号数相减时,不允许用小的数去减大的数,因为小减大它的差一定是负数,无符号数的前提是没有符号,显然也不允许有负数,如果这样做,减的结果也必然是错误的。 五、字符的编码 (一)ASCII码

原码、反码和补码

在计算机内,定点数有3种表示法:原码、反码和补码 原码:在数值前直接加一符号位的表示法 最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。[+7]原= 0 0000111B [- 7]原= 1 0000111B 数0的原码有两种形式: [+0]原= 0 0000000B [- 0]原= 1 0000000B 8位二进制原码的表示范围:-127~+127 反码:正数:正数的反码与原码相同。负数:负数的反码,符号位为“1”,数值部分按位取反。 正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。 [+7]反= 0 0000111B [- 7]反= 1 1111000B [+0]反= 0 0000000B [- 0]反= 1 1111111B 8位二进制反码的表示范围:-127~+127 补码:正数:正数的补码和原码相同。负数:负数的补码则是符号位为“1”,数值部分按位取反后再在末位(最低位)加1。也就是“反

码+1”。 正数的补码与其原码相同;负数的补码是在其反码的末位加1。[+7]补= 0 0000111B [- 7]补= 1 1111001B [ 0 ]补= 0 0000000B。 补码在微型机中是一种重要的编码形式,请注意: a.采用补码后,可以方便地将减法运算转化成加法运算,运算过程得到简化。正数的补码即是它所表示的数的真值,而负数的补码的数值部份却不是它所表示的数的真值。采用补码进行运算,所得结果仍为补码。 b.与原码、反码不同,数值0的补码只有一个,即 c.若字长为8位,则补码所表示的范围为-128~+127;进行补码运算时,应注意所得结果不应超过补码所能表示数的范围。

补码运算规则

补码(two's complement) 在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值位统一处理;同时,加法和减法也可以统一处理。此外,补码与原码的的相互转换,其运算过程是相同的,不需要额外的硬件电路。 补码的特性 1、一个整数(或原码)与其补数(或补码)相加,和为模。 2、对一个整数的补码再求补码,等于该整数自身。 3、补码的正零与负零表示方法相同。 机器数:计算机中参与运算的数被称为机器数,有以下特点, 1、计算机中参与运算的数均为二进制数,这是因为,运算电路是由只能识别“0”、“1”的数字电路组成。 2、机器数有带符号数和无符号数两种。 3、带符号的机器数有源码、反码和补码三种表示方式;无符号数没有源码、反码、补码的区别。 4、CPU的运算电路是按补码的运算规律设计,因此,进行运算的带符号数均用补码表示。 无符号数的运算 1、与手工二进制运算的方法相同(指运算电路)。 2、可以用十六进制数的运算代替二进制数的运算,计算时不容易出错,而且快捷。 源码表示法(带符号数) 1、正数。最高位是符号位,用“0”表示正号,即15~0位的第15位为0,7~0位的第7位为0。 2、负数。最高位是符号位,用“1”表示负号,即15~0位的第15位为1,7~0位的第7位为1。 3、求源码的方法:先将真值转换成二进制数,再写成固定的8位或16位,最高位用“0”或“1”表示数的正号和负号。计算机就是用这种方法表示。 真值就是带符号的十进制数(补码的绝对值),如+20、-20、+120、-120。在计算机内,如果是一个二进制数,其最左边的位是1,则我们可以判定它为负数,并且是用补码表示。若要得到一个负二进制补码的真值(原来的数值),只要对其求补码,就可得到真值。 【例5】-65的补码是10111111 若直接将10111111转换成十进制,发现结果并不是-65,而是191。 各位取反(除符号位):11000000,再+1:11000001(-65)

原码补码的转换

最佳答案补码补码举例1、在计算机系统中,数值一律用补码来表示(存储)。 主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补 码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。 2、补码与原码的转换过程几乎是相同的。 数值的补码表示也分两种情况: (1)正数的补码:与原码相同。 例如,+9的补码是00001001。 (2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。例如,-7的补码:因为是负数,则符号位为“1”,整个为10000111;其余7位为-7的绝对值+7的原码 0000111按位取反为1111000;再加1,所以-7的补码是11111001。 已知一个数的补码,求原码的操作分两种情况: (1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。 (2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取反,然后再整个数加1。 例如,已知一个补码为11111001,则原码是10000111(-7):因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”;其余7位1111001取反后为0000110;再加1,所以是10000111。 在“闲扯原码、反码、补码”文件中,没有提到一个很重要的概念“模”。我在这里稍微介绍一下“模”的概念: “模”是指一个计量系统的计数范围。如时钟等。计算机也可以看成一个计量机器,它也有一个计量范围,即都存在一个“模”。例如: 时钟的计量范围是0~11,模=12。 表示n位的计算机计量范围是0~2^(n)-1,模=2^(n)。 “模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的 余数。任何有模的计量器,均可化减法为加法运算。 例如:假设当前时针指向10点,而准确时间是6点,调整时间可有以下两种拨法: 一种是倒拨4小时,即:10-4=6 另一种是顺拨8小时:10+8=12+6=6 在以12模的系统中,加8和减4效果是一样的,因此凡是减4运算,都可以用加8来代替。 对“模”而言,8和4互为补数。实际上以12模的系统中,11和1,10和2,9和3,7和5,6和6都有这个特 性。共同的特点是两者相加等于模。 对于计算机,其概念和方法完全一样。n位计算机,设n=8,所能表示的最大数是11111111,若再加1称为100000000(9位),但因只有8位,最高位1自然丢失。又回了00000000,所以8位二进制系统的 模为2^8。在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以 了。把补数用到计算机对数的处理上,就是补码。 另外两个概念 一的补码(one's complement) 指的是正数=原码,负数=反码

补码运算的法则

补码运算的法则 补码运算的法则要在“微机原理”这门课中讲到,在“数字电子技术”课中不作重点,只需一般了解即可。在数字电子技术教科书中,补码部分是用4位或5位2进制数来讲的,所以本文中也多以4、5位二进制数做例子。 利用补码运算必须确定运算数的位数,这样才能确定补码的模数。 在计算机中,带符号的数的表示方法有3种:原码、补码和移码。本文不讨论移码。 一、计算机中数的表示法 1. 原码 对一个二进制数而言,若用最高位表示数的符号(常以“0”表示正数,“1”表示负数),其余各位表示数的本身,则称为二进制数的原码表示法。例如: 设 A = + 1001 , B = - 0101,则[A] 原= 0 1001,[B]原= 1 0101。[A]原、[B]原分别是A、B的原码,是符号数值化了的数。符号数值化之前的带符号的数A、B称为是“真值”。 2. 补码 (1)补码的定义: 根据同余的概念 X + NK = X ( mod K ) ………………① 括号中的部分不参加运算,它表示“K是模”。N是任意整数。该式的含义是,数X与该数加上其模的任意整倍数之和相等。例如钟表的表盘,模为12,不论指针转了几圈,3点总是3点。用定义式表示,即 3 + N×12 = 3 在①式中,当N=1时 有[X] 补数= X + K,[X] 补数 称为是X的补数。 当0 ≤X <K时,[X] 补数= X (正数的补码是其本身) 当- K ≤X <0 时,[X] 补数= X + K(负数的补码= X+K = 模-|X|)例如表盘模= 12 当X = 3 时,[3] 补数= 3 ,其涵义是表针正着转了3 格; 当X = -3 时,[-3] 补数= -3+12 = 9 ,其含义就是指针倒着转了3格,就等于正着转了9 格。 (因为X<0 ∴X+K = 模-|X| ) 模= “在限定的位数中可表示的最大数”加1 。 在计算机中,一个机器数的字长为n位,它能够表示的最大数为n个“1”,其模为2n。例如4位的机器数中,n = 4,可表示的最大数为1111B(1111B表示是一个二进制数),其模就是1111B + 1 = 1 0000 = 24。 4位二进制数的模是1 0000,即16;而8位二进制数的模是1 0000 0000,即256。 再例如十进制的模是10 ,十二进制的模是12。

计算机中数值的三种表示方法详解:原码,反码, 补码

计算机中数值的三种表示方法详解 原码,反码,补码 最近在学习软件评测师的知识,其中涉及到计算机的原码, 反码和补码等知识. 通过网上查阅资料,进行了深入学习,分享给大家。本文主要从以下几点进行介绍:如何计算原码,反码,补码?为何要使用反码和补码?希望本文对大家学习计算机基础有所帮助 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1、机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数+3 ,计算机字长为8位,转换成二进制就是00000011。如果是-3 ,就是10000011 。 那么,这里的00000011 和10000011 就是机器数。 2、真值 因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数10000011,其最高位1代表负,其真正数值是-3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。

例:0000 0001的真值= +000 0001 = +1,1000 0001的真值= –000 0001 = –1 二. 原码, 反码, 补码的基础概念和计算方法. 计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。 1. 原码 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制: [+1]原 = 0000 0001 [-1]原 = 1000 0001 第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是: [1111 1111 , 0111 1111] 即 [-127 , 127] 原码是人脑最容易理解和计算的表示方式. 2. 反码 反码的表示方法是: 正数的反码是其本身

相关文档
最新文档