有符号数的运算方法

一.有符号数的加减法

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求得。

可以说,后面例子是编译器和微机共同工作的过程,前面例子只关系微机运算。

  • 13
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Verilog中,有符号运算需要通过使用`signed`关键字或`$signed()`函来表示。有符号计算需要将操作声明为有符号类型,并且使用特定的运算符进行操作。 如果在Verilog叙述中有需要进行有符号计算,可以使用Verilog 2001提供的`signed`关键字或`$signed()`函来标识有符号。通过使用这些机制,可以确保有符号的正确计算结果。 需要注意的是,只有两个操作都是有符号时,才会将这两个操作都视为有符号进行计算。如果只有一个操作是有符号,那么无论另一个操作是有符号还是无符号,都会按照无符号计算。 举个例子,假设有以下Verilog代码: ``` wire [3:0] a=4'b1001; wire signed [3:0] b=4'b1110; wire signed [4:0] c; assign c = ((a + b)>>>1); //-9=10111 ``` 在上述代码中,通过将变量`b`声明为有符号类型,可以确保与变量`a`的计算结果是按照有符号进行计算的。在这种情况下,计算结果将是-9。 综上所述,Verilog中有符号运算需要使用`signed`关键字或`$signed()`函来标识有符号,并确保所有操作都是有符号才能正确进行有符号计算。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [verilog中的有符号运算(转)](https://blog.csdn.net/feixiaku/article/details/8646674)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Verilog有符号与无符号运算](https://blog.csdn.net/u014485485/article/details/79962316)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值