HDLbits 刷题 -- Exams/ece241 2014 q1c

Assume that you have two 8-bit 2's complement numbers, a[7:0] and b[7:0]. These numbers are added to produce s[7:0]. Also compute whether a (signed) overflow has occurred.

译:

假设您有两个8位2的补码数,a[7:0]和b[7:0]。这些数字相加得到s[7:0]。还要计算是否发生了(有符号)溢出。

解法:

module top_module (
    input [7:0] a,
    input [7:0] b,
    output [7:0] s,
    output overflow
); //
  
    assign s = a+b;
    assign overflow = ( a[7] && b[7] && ~s[7] ) || (~a[7] && ~b[7] && s[7]);
endmodule

分析:

assign overflow = ( a[7] && b[7] && ~s[7] ) || (~a[7] && ~b[7] && s[7]);:这行代码定义了溢出检测逻辑。溢出发生的条件是:

&&是逻辑与操作符,~是逻辑非操作符,||是逻辑或操作符。

  • ab的最高位(即符号位)都是1(表示它们都是负数),并且结果s的最高位是0(表示结果是非负数),这意味着发生了下溢。
  • ab的最高位都是0(表示它们都是非负数),并且结果s的最高位是1(表示结果是负数),这意味着发生了上溢。

在计算机科学中,特别是在使用补码表示法的系统中,最高位(即最左边的位)通常用作符号位,用来表示一个数是正数还是负数。在补码系统中:

  • 正数的补码就是其本身,符号位为0。
  • 负数的补码是它的绝对值的二进制表示取反(所有位取反)后加1,符号位为1。

当两个负数相加时,它们的补码表示法中符号位都是1。如果这两个负数相加的结果是一个正数或非负数(即结果的符号位为0),那么结果的绝对值会大于可以表示的最大正数,因此发生了下溢。

相反,当两个非负数(正数或零)相加时,它们的补码表示法中符号位都是0。如果这两个非负数相加的结果是一个负数(即结果的符号位为1),那么结果的绝对值会小于可以表示的最小负数,因此发生了上溢。

在8位系统中,可以表示的最大正数是 01111111  01111111​(即 127 ),可以表示的最小负数是 10000000 10000000 ​(即 −128 ​),因为负数使用补码表示。

让我们用一个具体的例子来说明:

  • 假设  a=11111110 ​(即 −2 )
  • 假设  b=11111110 (即 −2  ​)

这两个数都是负数,它们的补码表示法中符号位都是1。当它们相加时:                                             a+b=1111 1110+1111 1110=1 1111 1110

结果的二进制是 1 1111 1110 ​,这超出了8位表示的范围,并且它的补码表示了一个大于可以表示的最大正数的值,因此发生了下溢。

同样地,如果我们考虑两个正数,比如:

  • 假设 a=01111111 ​(即 127​)
  • 假设 b=00000001​(即 1)

这两个数相加:

a+b=0111 1111 +0000 0001=1000 0000

结果的二进制是 1000 0000 ,在8位补码系统中,这表示的是最小的负数 −128 ,而不是我们期望的 128 。这是因为结果超出了8位整数可以表示的范围,导致上溢。

总结来说,两个正数相加的结果是否符合预期,取决于它们的和是否在可表示的范围内。如果结果超出了这个范围,就会发生溢出,导致不正确的结果。

  • 13
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刚及格的陆拾伍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值