我想从五个方面来说说有符号二进制加法溢出以及溢出后该如何计算这些个问题:

  1. ·什么是有符号二进制数
  2. 补码的计算以及还原
  3. 有符号数的加法
  4. 什么是溢出、什么是自然丢弃
  5. 溢出后该如何正确计算结果

一.什么是有符号二进制数

二进制数分为有符号和无符号两种形式,在未标明的情况下,二进制数指的是无符号二进制数,即没有负数形式。反之,有符号二进制数,是指有正负号的二进制数。

有符号二进制数即在无符号二进制数的基础上,在最左边添加符号位,‘0’为正,‘1’为负。

举例说明:-2 1(符号位 ‘1’表明是负数)10(2的二进制表达) --> 110

                      +2 --> 010 

二.补码的计算以及还原

在计算机的运算中,是以补码的形式进行加减法运算的(减法其实就是带负数的加法,2-3 其实就是2+(-3))。那补码是怎么计算的呢?

分为两种情况:

1.正数补码。 记住正数的补码就是其本身。如:+2 -->010 补码–> 010

2.负数补码。 符号位不变,将符号位后面的所有数取反,之后进行加一操作。如:-2 --> 110 补码 --> 101 + 1 -->110. 可以发现它的补码和原码相同,这里大家留个心眼,为后面的溢出埋下伏笔。

学会了原码转补码,怎么能不会补码转原码呢。

补码转原码其实就是再将补码进行一次求补码的操作,即补码的补码是原码。

三.有符号数的加法

接下来就是开始进行加法操作了。在补码的加法运算中,符号位就当成是整个二进制数的一部分,进行加法运算。

如:+3 + 4
3 --> 0011
4 --> 0100
相加 --------
结果 0111

然后对所得结果求补码(这点很重要,前面例子发现有些负数的补码就是其本身,为了后面不弄混淆,建议对所得结果求补码)。此处,正数的补码是其本身。计算结果就是0111。

0 表示正数 111的十进制是7,解为+7。完全正确。

提一点如果两个相加数的位宽不同,将小的位宽的数左起填充0,然后再进行补码操作。

如-2+8 110 + 01000 此处将-2做如下处理。10010(五位保持和+8一样位宽) 再将10010做补码处理,–>11101+1–>11110。补码形式加法为:11110+01000

接下来请看什么是溢出,以及溢出的危害是什么。

四.什么是溢出、什么是自然丢弃

对于溢出的理解,稍微解释的不详细很可能会把初学者带入沟里,今天我就被带进沟里了。作为一个过来人我很愿意和大家分享,让初次接触的朋友们能很快的理解,避免和我一样花大量时间从沟里爬出来。言归正传。

说到溢出,还是要先提一下自然丢弃。

前面的例子是很简单的例子,请看下面这个例子:

-2 - 6
-6 --> 1110
-2 --> 1010
相加 --------
结果 11000

结果的位数比原先的多出了一位,此处最左边的1,是会被自然丢弃的(就是不要了)。再看结果,对1000求补码(其实可以看出它就是0)。这和我们想要的-8有天壤之别。为什么会出现这个情况呢?

原因就是这里出现了溢出!

首先来看溢出的定义:

对一个N位二进制补码,其可以表达的范围是 - 2^(N-1) 到 2^(N-1) - 1之间。如果超出这个范围就称为溢出了。

拿上面的-2-6来说,我们刚刚在计算时,转换为二进制补码是4位的。它的取值范围是-8到+7之间。而我们想要的结果是-8,比范围的最小值还要小,这个叫做负溢出。同理如果想要的结果比最大值还要大,那么就叫做正溢出,如取值范围是-7~+7之间,想要的结果是+8,那么就是正溢出。

说完了溢出的定义,我们来说说溢出的判定,就是怎么在计算开始时知道自己算的结果是不是溢出了?

还是拿前面-2-6为例,即1110 + 1010,大家可以看到我拿两种不同颜色标注了它们最开头的两个数,我们把红色的(左起第一位)符号位进位值和蓝色(左起第二位)相加的进位值进行比较。如果两者相同(即00或者11),则不溢出,如果两者不同(即01正溢出,10负溢出),则发生溢出,最后的解必定会出错。

拿-2-6为例,它们补码形式为1110+1010,符号位相加发生了进位,进位值为1,数字位左起第一位相加没有发生进位,进位值为0,即10型溢出,为负溢出,就是说所得的值小于四位二进制补码的取值范围,和我们计算的-8<-7结果相匹配,判断成功。

到这里我们已经成功了一大半,与最终正确解的就值就差一步之遥。

五.溢出后该如何正确计算结果

在通过判断之后,我们知道这个结果定是溢出了,该怎么求正确的解呢?

答:将位宽扩大一位,还是按前面的判定方法进行判定。

举例,-2-6 前面说了这是一个负溢出,我们在转换为二进制时进行位宽扩大,以提升取值范围。

此处 -2 二进制写成 10010(5位比开始多一位),-6二进制写成10110(5位比开始多一位)。再进行补码运算,10010–> 11101+1–>11110,10110–>11001+1–>11010.

11110

11010

相加---------

  111000 最高位超出位宽,自然舍弃,剩下的11000求补码,10111+1-->11000 即-8,和我们所求的结果一致,bingo答对了。

转载:负数二进制计算
—————————————————————————————————————————————
计算-2 -6 = -8
思路:-2的补码 + -6的补码 = x; 再计算x的补码就是-8
-2——>100010 ——> 111101 + 1 ——>111110 (-2补码)
-6——>100110 ——> 111001 + 1 ——>111010 (-6补码)
-2 + -6 = 111110 +111010 = 1111000 ——> 111000 ——> 100111+ 1 = 101000 = -8

有符号二进制加法溢出判断以及溢出后该如何计算正确答案相关推荐

  1. 算法 2.二进制加法

    算法 2. 二进制加法 问题描述 输入 输出 测试数据 答 问题描述 输入 第一行输入一个正整数 T (1≤T≤10)(1 \leq T \leq 10)(1≤T≤10),表示接下来有 T 组数据: ...

  2. 编程实现 无符号加法溢出判断

    //无符号加法溢出判断 #include<iostream> using namespace std; int uadd_ok(unsigned x,unsigned y) {unsign ...

  3. 两个整数相加 相乘 有符号与无符号 溢出判断条件 移位与2的幂

    无符号数相加 算术运算溢出:完整的整数结果不能放到数据类型的字长限制中去 无符号数溢出 无符号数求反 补码加法 补码溢出 补码的非 无符号乘法 补码乘法 无符号乘法和补码乘法结果的位模式相同 与2的幂 ...

  4. Verilog 补码加法溢出判断及处理

    补码加法运算溢出判断三种方法: 一.符号位判断 Xf.Yf分别两个数的符号位,Zf为运算结果符号位. 当Xf =Yf =0(两数同为正),而Zf=1(结果为负)时,负溢出: 当出现Xf =Yf =1( ...

  5. 编程实现 有符号乘法溢出判断

    //有符号乘法溢出判断 #include<iostream> using namespace std; int tmult_ok(int x, int y ) {int pro = x*y ...

  6. 编程实现 无符号乘法溢出判断

    //无符号乘法溢出判断 #include<iostream> using namespace std; int main() {unsigned int x,y,pro;cin>&g ...

  7. 编程实现 带符号加法溢出判断

    //带符号加法溢出判断 #include<iostream> using namespace std; int tadd_ok(int x,int y) {int sum=x+y;int ...

  8. 编程实现 无符号减法溢出判断

    //无符号减法溢出判断 #include<iostream> using namespace std; int usub_ok(unsigned x,unsigned y) {unsign ...

  9. 无符号数和有符号数的溢出判断

    因为学了微机原理的课程,发现好多人对无符和有符的判断很迷(meng)茫(bi),所以决定总结一下. 无符号数溢出判断:其实很简单,就一句话: 当最高为向更高位有进位(或借位)时产生溢出. 就像这样: ...

  10. (计算机组成原理)第二章数据的表示和运算-第二节4:定点数的加减运算和溢出判断

    文章目录 一:使用原码实现加减法基本逻辑 (1)原码加法 (2)原码减法 二:使用补码实现加减法 三:溢出判断 (1)采用一位符号位依据溢出表达式判断 (2)采用一位符号位依据进位情况判断 (3)采用 ...

最新文章

  1. 如何基于消息中间件实现分布式事务?万字长文给你答案!!
  2. perl regular expresstion
  3. linux的模块化,GoboLinux 017 发布,模块化的 Linux 发行版
  4. 英语 语义分割_英语关系分句的翻译技巧
  5. CentOS8 模块化仓库
  6. 回客科技 面试的 实现ioc 容器用到的技术,简述BeanFactory的实现原理,大搜车面试的 spring 怎么实现的依赖注入(DI)...
  7. 计算某日是该年的第几天
  8. ai/ml_您应该在本周(7月18日)阅读有趣的AI / ML文章
  9. Linux 命令收集
  10. apache ii评分怎么评_apache ii评分多少分为危重患者
  11. 查看打包成exe程序的批处理并提取代码
  12. poj3345——bribing FIPA
  13. android 监听飞行模式,如何在Android上检测飞行模式?
  14. 安防系统的定义及相关组成部分详解
  15. 【记录】螺纹连接与螺旋传动
  16. 使用Python实现日历功能
  17. 李彦宏说百度吹的牛都实现了,还扔出来一个ACE计划
  18. 手机UC浏览器字体放大
  19. 鲲鹏平台兼容的操作系统介绍
  20. 在家赚钱的可靠方法,5个方法各个月入过万!

热门文章

  1. 【开发常识】手机号为什么要隐藏中间的四位数?
  2. 常用地理信息数据下载平台
  3. Unity 根据文件路径批量修改图片格式
  4. 【java毕业设计】 基于java+SSH+JSP的保险业务管理系统设计与实现(毕业论文+程序源码)——保险业务管理系统
  5. Python大数据分析LOL游戏胜率
  6. 2020.07.01-07.15学习小结
  7. 洛达检测软件AB1562UT_1.4.4新版本下载,适用洛达全系列
  8. Windows Server 2016安装IIS服务步骤
  9. 安装IIS以及配置ASP.NET流程
  10. 参加电子工业出版社博文视点举办的作者高峰论坛有感