关于补码运算中进位溢出的问题及延伸,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]。还要计算是否发生了(带符号的)溢出

我们需要了解一下补码的概念,二进制数据计算时,由于负数的出现,单纯的二进制数无法计算(即原码)。为了区分正数和负数,在原码的最高位前新添加了一位,称之为符号位(0表示正,1表示负),但是仅仅这样是不够的,你可以尝试计算一下-3+5,因此把负数中所有二进制数取反(此时为反码),然后+1,正数还是原来的样子,此时这种形式的数据称之为原数据的反码。由于反码的存在,带二进制数可以直接进行加减运算。
然而在反码计算的过程中,会出现符号位溢出的问题,例如-7-5的计算为1001+1010=(1)0011,即结果为+3,这显然是不正确的,因此该问题中除了简单的相加,更要考虑进位问题的存在,下面是该题的代码:

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

要明确,出现错误的根源是两个数相加后的进位与原本的符号位进行运算,覆盖掉了原本的符号位,也就是以下两种情况:
1.输入为两个正数,并产生了进位1,覆盖了原本得数的符号位0.(例如反码计算 0100+0100)
2.输入为两个负数,两个数符号位相加产生0(例如反码计算1001+1001)

其实 为了避免这种情况的发生,产生了一种反码的另一种形式,即变形补码:

变形补码,又称”模4补码“即用两个二进制位来表示数字的符号位,其余与补码相同。变形补码,用“00”表示正,用“11”表示负,也称为模4的补码。用变形补码进行加减运算时,当运算结果的符号位出现“01”或者“10”时,则表示产生溢出。变形补码的最高位(第一个符号位)总是表示正确的符号,比如"00"、 “01”分别表示正数、正溢出(上溢),“11”、“10”表示负数、负溢出(下溢)。(摘自百度百科)

【小罗的hdlbits刷题笔记2】补码运算中溢出的问题(Exams/ece241 2014 q1c)相关推荐

  1. 【小罗的hdlbits刷题笔记3】从Edgedetect对阻塞赋值和非阻塞赋值的思考

    今天题目刷到Edgedetect时,发现根本看不懂这个题目描述的是什么,先给大家放题来体会一下: For each bit in an 8-bit vector, detect when the in ...

  2. 【小罗的hdlbits刷题笔记5】基于fifo思想的fsm设计(Exams/2014 q3fsm)

    在写状态机时,经常会有检测输入信号波形的情况,这种情况下,如果采用三段式状态机书写,则需要通过穷举法把输入信号所有可能存在的情况书写出来,在检测一到两个周期的输入信号时工作量不会很大,但是在检测多于三 ...

  3. 【小罗的hdlbits刷题笔记4】从lemming4中的有限状态机debug过程中的一些感悟

    心累,debug过程就是很烦,先说一下结论:设置变量时一定要注意位宽,否则会出现截位导致输出结果出现bug 废话不多说,先上问题 *Although Lemmings can walk, fall, ...

  4. 《剑指 Offer I》刷题笔记 51 ~ 61 题

    <剑指 Offer I>刷题笔记 51_60 位运算(简单) 51. 二进制中 1 的个数 _解法1:逐伟判断 解法2:巧用 n&(n-1) 52. 不用加减乘除做加法(背题) 解 ...

  5. 牛客网java刷题笔记2019-1-4

    牛客网java刷题笔记 2019-1-4 1.java中可以用类中构造器调用其他类构造器(这个和C++中构造函数很类似)用于初始化程序变量值, 构造器和方法的区别: 功能和作用的不同 构造器是为了创建 ...

  6. HDLBits刷题合集—9 Arithmetic Circuits

    HDLBits刷题合集-9 Arithmetic Circuits HDLBits-66 Hadd Problem Statement 创建一个半加器.半加器将两个输入(不带低位的进位)相加产生和和向 ...

  7. 小何同学的leetcode刷题笔记 基础篇(01)整数反转

    小何同学的leetcode刷题笔记 基础篇(01)整数反转[07] *** [01]数学取余法*** 对数字进行数位操作时,常见的方法便是用取余的方法提取出各位数字,再进行操作 操作(1):对10取余 ...

  8. 师兄刷题笔记、算法小抄、面试突击版必备资源,帮你走上人生巅峰

    前言 最近有很多朋友问我刷题.面试有没有什么好的资源.今天就给大家找了三个棒的开源资源,内容非常硬核,很多人靠着它进了大厂. 不绕弯子,三个分别是谷歌师兄<谷歌大佬的刷题笔记>,东哥< ...

  9. leetcode刷题java、c++、go语言三合一版本 谷歌师兄的刷题笔记、东哥的算法小抄、 Guide哥的Java面试突击版

    不久前火爆 GitHub 的 LeetCode 中文刷题手册,分享给大家,让正在找工作的朋友能够快速找到心仪的offer! <LeetCode Cookbook>目前已经收录了 520 道 ...

最新文章

  1. Hbuilder Android证书申请
  2. git统计每个人的代码行数_项目出了bug如何甩锅?使用这个Git工具帮你找到元凶...
  3. 用java爬虫来提高CSDN博客访问量,浏览量
  4. c++检测ip是否匹配子网掩码_网络工程师从入门到精通通俗易懂系列 | ARP和IP这篇文章讲的相当详细了,这么基础的知识往往也是最容易遗忘的!...
  5. python二进制、字符编码及文件操作
  6. 深度学习-CNN提取图像特征
  7. 【Java】深入理解Java虚拟机的读书笔记
  8. php -- php数组相关函数
  9. JAVA网络编程——URL
  10. 好用的文件批量改名工具推荐
  11. C++代码实现栈基本操作
  12. jxl 实现导出excel添加水印
  13. Python 列表,for循环,元组的使用【修改、添加、删除、排序、切片】w
  14. 纯前端实现—下拉菜单
  15. chromium下载编译过程
  16. Linux一键脚本自动化安装项目环境
  17. 微信公众帐号开发教程第2篇-开发模式启用及接口配置
  18. html xmlns=http://www.w3.org/1999/xhtml是啥
  19. kerberos 之TGS_REQ、TGS_REP
  20. php获取网卡网速,Golang 获取网卡时时带宽,可用于测速

热门文章

  1. 想要秒变“优牙人”,只需要uya.ren
  2. 玩儿转ffmeg的7个技巧
  3. linux rcs启动脚本嵌入式,嵌入式Linux系统启动脚本rcS
  4. Android 之路44---四大组件之ContentProvider
  5. 基于ssm的校园二手物品交易平台(idea+spring+springmvc+mybatis+jsp)
  6. 【NXP出品PINS-TOOL-IMX】IMX6ULL引脚配置工具PINS-TOOL-IMX介绍
  7. Quartus报错“Can't place multiple pins assigned to pin location Pin_76”
  8. 苹果手机消息先发给服务器,iPhone接收微信信息延迟,可能是这3个问题导致的,赶紧自查一下...
  9. 用户使用手册与测试报告(团队作业)
  10. 学籍管理系统源代码java_java学籍管理系统完整版.zip