无符号数和有符号数的运算

本文解答了一个关于有符号数运算的题目,涉及负数表示的补码理解、运算时的扩充高位策略以及正确计算方法。作者通过模型仿真和理论解析,澄清了运算顺序和负数表示的误区。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在书上看到这样一道题,由于知识缺乏导致很难对这道题完全理解和运算,因此在这里分享出来供大家参考。

题目如下:

wire signed [4:0] a;
wire unsigned [4:0] b;
wire signed [5:0] c;
assign a= -5;
assign b = 5;
assgin c =a-b;
c的输出值为多少

在计算的过程中一共遇到以下几个问题:

1.如何表示有符号数的负数

起初由于对符号位的错误不全,认为-5用二进制表示是10101,最高位bit5是符号位,为1代表为负数,剩下的4bit0101表示5,因此5’b10101为-5。

这是一个很大的误区,实际上有符号负数的表示不仅仅在符号位体现了其是负数,符号位之外的其余bit通过补码外加上符号位的1共同表示了有符号负数的二进制数。4’b0101的补码为4’b1011,因此本题中-5应该表示为5’b11011。

2.何时扩充高位,高位如何填充

首先第一个问题是何时扩充高位,因为最后的计算结果c是6bit,而两个操作数均为5bit,那么是先计算出结果,再填充符号位(因为结果c被定义为有符号数)还是先扩充再进行计算呢?

按照自己的想法先进行扩充,再进行计算试一试。

第二个问题是对于有符号数,认为将其变为6bit时扩充位填充其符号位1,因此变为6’b111011,对无符号数,为了方便计算将-b看为一个整体,将其当作-5那么为5’b11011,然后扩充为6’b111011。

然后通过加法如下:

 111011

 111011

= 1110110

最终得到这样一个结果,由于只有6bit于是最终结果为6’b110110。

由于对这里不明表,先通过modelsim进行仿真得到了输出结果c为6’b010110。

最终发现结果不一致,难道是先计算再扩充吗,按照这样的思路通过下面的加法:

11011

11011

=110110

发现结果还是不对,后来我将过程插接,先在代码里定义一个6bit的有符号数a_1,6bit的无符号数b_1,然后将a,b分别赋值给他们再进行进行仿真,结果还是不对。

之后通过百度,终于找到了一种说法:

当无符号数和有符号数进行运算时,将有符号数当作无符号数进行处理。

3.正确计算方法

首先a=5’b11011,b=00101。

首先对其进行扩充(这是必须的,先进行扩充再进行运算)a变为6’b011011,b变为6’b000101。之后因为是减法,所以取补码得到-b=6’b111011。然后进行下面的运算:

011011

111011

= 1010110

由于只有6bit,所以最终结果为6’b010110,与仿真结果一致。

那这里最高位bit6的1被去掉合理吗,答案是合理的。

在计算两个正数的减法时,我们通常减数与减号看成一体,将其表示成补码形式进行相加,其实这里最终就变为被减数+(2n-减数)-2n。被去除的最高位就是这里的-2n,而取补码则是(2n-减数)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值