有符号数的加减法 和无符号数的加减法,和,系统是如何识别有符号数和无符号数的...

一.有符号数的加减法

1、符号数与无符号数的人为规定性:
一个数,是有符号数还是无符号数都是人为规定的。进行二进制运算时用无符号数或是补码运算时,结果都是正确的。
10000100+00001110
若规定为无符号数,即 132+146=146D 。
若规定为符号数,则为-124+14=-110,而[-110]补=10010010。解释:10000100是 -124的补码,0001110是14的补码,在机器中运算后得出的结果是[-110]的补码。机器中的有符号数的运算一般就是补码的运算。
2、补码加减法运算
  计算机中,当确定为符号数运算时, 符号数一律用补码表示,运算时符号位和数字位一起参加运算。同样,运算结果也用补码表示。
1)两符号数相加公式:
[X+Y]补 (MOD2)=[X]补+[Y]补    //MOD2即 mod 2^n,即丢弃符号位的进位(因为符号位参与运算是补码运算的特点)
2)两符号数相减公式:
[X-Y]补 (MOD2)= [X]补+[-Y]补
 
3.例子:
求3CH-90H。
首先3CH=0011 1100,90H=1001 0000
(1)当为有符号数时,显然这两个数是某两个数的补码。(具体是哪两个数X Y, 需要自己计算)。运算结果也是补码,是X-Y的补码 [X-Y]补。机器只运算到这一步。[X-Y]补 就是运算结果,溢出 进位等标志位也都是这个补码运算过程的结果,由硬件ALU运算。X-Y并不是机器的运算结果,由[X-Y]补求X-Y是在计算机组成原理中由程序员或者编译器完成的工作,对于编译器来说运算结果才是X-Y,编译器属于软件,不属于硬件机器。
 
根据微机中有符号数(补码)的减法公式,[x]补(输入)-[Y]补(输入)=[x]补+[-Y]补(求补操作结果)=[X-Y]补(微机运算结果) ,求[-Y]补是关键
[x]补=0011 1100,[Y]补=1001 0000,
[-Y]补=[Y]补的 求补=0110 1111(取反)+1(加一)=0111 0000  //不是[Y]补的补码!!更不存在什么 -[Y]补 的补码(不存在-[Y]补这种写法)
 解释求补操作:  
无论-[Y]补的符号位是0还是1。正数也可以有求补操作,只是得到的数不叫补码,就是为了把减法转换成加法。求补操作 就是取余(求补)(补码是人规定的,但是求补是数学定义)。证明[-Y]补=对-[Y]补 求补操作:[0]补=[-x]补+[X]补 。[-x]补和[X]补不是正数和负数的关系!!而是互补关系,算数相反,不是逻辑相反。另外仔细想一下,我们学补码是为了什么?以前是为了求一个原码的补码是什么,因为计算机组成原理中 从编译器到微机 从微机到编译器 需要原码变成补码 补码变成原码,但是在微机原理中,就不需要这一部分了,而是需要 求补操作了。计算机组成原理中,是由y原码求出来的[-y]补,而微机原理中是 对[y]补 求反操作出来的[-y]补,计算过程都不一样。计算机组成原理中的过程可以理解 但是不是微机真正的运算过程,这一次学习的微机原理的补码的加减法才是真的硬件的运算过程!
另外,补充一点,X=[X]补 的补码,由补码求原码时不用按照由原码求补码的逆过程(补码为1000 0000时例外!)。
《微机原理与接口技术》中写道:“由加法器的原理图,加法器的方式控制M用于控制加减法,当M=0时进行S=A+B操作,当M=1时进行S=A-B操作。当M=1(减法)时,各个异或门对B的各位进行求反,并将1作为初试进位加入结果,也就是执行对B的求反加1,即求补操作。” 也就是说!无论B是有符号数还是无符号数,无论符号位是0还是1,只要M=1,就统统对B执行求补操作!!!所以,求补操作可以对符号位是0的数执行!
 
所以,[X-Y]补=0011 1100-1001 0000=0011 1100+0111 0000=ACH
 
(2) 补码最大好处就是不管是有符号数还是无符号数都可以用同一套加减法 。系统对有符号数和无符号数的加减法都采用一样的策略。
无符号加减法不存在溢出问题,只是将进位或借位存储在CF中。
机器不知道你进行的运算是否有符号,如果你进行的是有符号运算,你需要查看OF,否则不需要。
所以,溢出不溢出,是由程序员判断的,机器不知道。
 
不管是有符号数还是无符号数,微机都是按补码运算,至于是进位还是溢出不仅要看进位标志位,还要看溢出标志位。
只不过在做无符号数运算时程序员不考虑溢出标志位,只考虑进位标志位而已。
比如0111+1101,你说它是无符号数7+13呢,还是有符号数7-3呢?
对微机而言这是一回事!
所以,微机中,无符号数时和有符号数时的运算结果一定是一样的。
 
(3)注意这道题和《计算机组成原理》学补码加减运算时的题目的区别。
例子:X=+0101,Y=-1010,求X-Y。
题目给的X Y,是原码, 所以已经默认是有符号数,也有判断是否溢出,所以默认的计算过程也是指机器运算过程。
原码在机器中 均是以补码保存和运算的,
[x]补-[Y]补=[x]补+[-Y]补=[X-Y]补,只用到了[x]补+[-Y]补=[X-Y]补
属于类型:已知X Y,所以先求[X]补, [-Y]补 ,便求得[X-Y]补。然后求X-Y。
也就是说,上一题已知的是[X]补 [Y]补,(机器的)运算结果是[X-Y]补。中间过程没必要求出X Y是什么数。
本题已知的是X Y,先得出机器的运算结果[X-Y]补,在做编译器的工作由[X-Y]补 求出X-Y。
二者求[-Y]补的方法不一样:前者是对[Y]补 求补操作 求得的,后者是由-Y求得。
可以说,后面例子是编译器和微机共同工作的过程,前面例子只关系微机运算。
 ----------------------------------------------------------------------------------------
二.那么系统是怎么识别有符号数和无符号数的呢?

(1)CPU只会根据输入信号进行逻辑运算,在硬件级别是没有有符号无符号的概念,运算结束会根据运算前的信号和输出信号来设置一些标志位,是不是有符号由写程序的人决定,标志位要看你把操作数当有符号还是无符号来选择,就像内存中的数据,你可以按照需要来解析,原始数据在那里,你要按什么数据格式来解析在于自 己的选择;

在汇编语言层面,声明变量的时候,没有 signed 和 unsignde 之分,汇编器统统将你输入的整数字面量当作有符号数处理成补码存入到计算机中,只有这一个标准!

(2)

计算机对有符号整数的表示只 采取一套编码方式,不存在正数用原码,负数用补码这用两套编码之说,大多数计算机内部的有符号整数都是用补码,就是说无论正负,这个计算机内部只用补码来 编码!!!只不过正数和0的补码跟他原码在形式上相同,负数的补码在形式上与其绝对值的原码取反加一相同。

(3)

有符号数和无符号数在计算机里表示都是一样的,二进制的补码形式。
是有符号还是无符号,是编译器来辨认的。
例如:
unsigned char uch, char ch;
在内存中有个数0b11111111.
把它赋给uch,那么uch就是127
如果赋给ch,那么ch就是-1

---------------------------

《微机原理与接口技术》中写道:“在微机中,对于定点数存在无符号数和有符号数的概念。无符号数表达的是 大于等于0的数,在机器表示时不需要表示符号的信息。...。在计算机中,常用8位,16位,32位,64位等字节整数倍的位数进行定点数的表示。”也就是说,《计算机组成原理》中的5位 7位等的数,实际上是没有意义的,当时只是为了理解一些运算概念才出的那些题。

《微机原理与接口技术》中写道 :“时钟一圈是12个小时,顺时针+1,逆时-1,这样,在时钟上-1和+11是一样的。类似,用8位来表示有符号数,它的一周是2^8=256,所以-1就可以用255(2^8-1)来表示,这就是补码的含义。

再次强调:微机中有符号数的机器表示是补码在微机中,将“求反加1”操作称为求补操作,又称为算数求反(在数的前边加上负号)。补码具有以下特性:

                                                [-x]补=[x]补的求补     //所以,[-x]补 并不是 -[x]补 的补码!!//在前面加上负号 就是要求补操作:按位求反加一。

                   [x+y]补=[x]补+[y]补

                                                [x-y]补=[x]补+[-y]补 

有第三个补码特性可以看出,补码的减法运算可以变为加法运算。这样,cpu中就可以用加法器直接实现减法,而不再需要再专门设置实现补码减法的部件了。”

也就是说,微机原理中的加减运算都是补码加减运算,和计算机组成原理中的加减运算不一样了!因为是计算机组成原理,所以包括了微机补码加减运算和编译器运两个工作部分算,而微机原理只有补码加减运算部分,只是计算机组成原理的运算过程中的一部分了。所以,一定要注意计算机组成原理和微机原理的区别,前者包含后者。

 

转载于:https://www.cnblogs.com/flowerslip/p/5934718.html

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值