补码运算中的溢出_二进制补码运算溢出判断

补码运算中的溢出_二进制补码运算溢出判断当两个以补码表示的负数相加时,会遇到两个问题。第一是两个负数的符号位相加,1+1后,本位为零,似乎负数相加变成了正数;其二是两个负数的数值部分之和,如果不向符号位进位,是不是就说明运算结果没有溢出?但不进位最终将导致两个负数相加成了正数,显然是错误的,这该怎么解释?如果两个以补码表示的负数的数值部分之和向符号位进位,会使运算结果依然为负数,那么这个运算结果是正确的吗?下面我们分析一下这个问题:

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
当两个以补码表示的负数相加时,会遇到两个问题。第一是两个负数的符号位相加,1+1后,本位为零,似乎负数相加变成了正数;其二是两个负数的数值部分之和,如果不向符号位进位,是不是就说明运算结果没有溢出?但不进位最终将导致两个负数相加成了正数,显然是错误的,这该怎么解释?如果两个以补码表示的负数的数值部分之和向符号位进位,会使运算结果依然为负数,那么这个运算结果是正确的吗?下面我们分析一下这个问题:




①只有真正意义上的相加才可能溢出,比如:




 

 

 

 

正+正,负+负,正-负,负-正




 

 

 

 

纯粹的减法是不可能溢出的,这一点仅需常识即可作出判断,所以遇到不是真正意义上的加法运算(当然,包括乘法和左移等)要你判断是否有溢出,直接就可以回答:OF=0;




②两正数之和的数值部分向符号位进位,显然是运算结果超过了指定位数的带符号数的表示范围,这就是典型的溢出;




③两负数之和的溢出判断是我们讨论的重点。我们先考察一下负数原码和补码数值部分之间的关系:以8位补码为例,负数原码和补码数值部分之和始终等于128
由于这种关系,当原码数值大时对应的补码数值就小,反之也一样。所以,当两补码表示的负数的数值部分之和没有向符号位进位,说明两负数的原码之和必然向符号位进位,即发生溢出;反之,当两补码表示的负数的数值部分之和向符号位进位,那么对应两负数原码的数值之和就不可能向符号位进位,即运算结果没有溢出;并且在这种情形下补码之和的数值部分向符号位的进位,修正了两负数符号位相加本位为零的问题,使得两负数之和依然是个负数。


 

 

 

 

下面看两个负数补码相加溢出判断的实例:


例一:085h 



9ch


 

 

 



10000101b 



10011100b


 

 

 

两数相加,数值部分不会向符号位进位,这是不是就说明没有溢出呢?但由于计算结果为正,显然不对。我们还是看看两个数的原码之和再说:


 

 

 

 

10000101b的原码 



11111011b(-123)


 

 

 

 

10011100b的原码 



11100100b(-100)


 

 

 

 

显然,原码之和的数值部分将向符号位进位,显然是溢出无疑。




例二:0e7h 



0b3h


 

 

 

 

=11100111b 



10110011b


 

 

 

 

两数相加,数值部分会向符号位进位,这进位是溢出吗?还是看看原码吧!


 

 

 

 

11100111b的原码 



10011001b(-25)


 

 

 

 

10110011b的原码 



11001101b(-77)


 

 

 

 

容易看出,两数原码之和没有向符号位进位,即没有发生溢出。


 

 

 

 

其实归结起来,补码的溢出判断规则就一句话:




 

 

 

 


号数相加如果结果的符号位和两加数不同,既是溢出。




 

 

 

 

这自然说明了:


 

 

 

 

⑴不是同号数相加,则不可能溢出;


 

 

 

 

⑵同号数相加有可能溢出;


 

 

 

 

⑶同号数相加如果结果的符号位和两加数不同,既是溢出

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/190679.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux软链接的创建、删除和更新[通俗易懂]

    linux软链接的创建、删除和更新[通俗易懂]大家都知道,有的时候,我们为了省下空间,都会使用链接的方式来进行引用操作。同样的,在系统级别也有。在Windows系列中,我们称其为快捷方式,在Linux中我们称其为软链接(基本上都差不多了,其中可能有差别,但是那又怎样呢?我们只要实现我们的效果,谁会有精力去管它茴香的茴字有几种写法呢?)。Windows老姑娘的那几个姿势这里就不赘述了,我们今天主要说下Linux中的茴香的茴字怎么写。

    2022年6月12日
    28
  • JWT单点登录(源码学习)

    JWT单点登录(源码学习)三、JWT源码学习//登录成功之后,需要生成tokenStringtoken=Jwts.builder().setSubject(“用户名/用户信息”)//主题,可以放用户的详细信息.setIssuedAt(newDate())//token创建时间.setExpiration(newDate(System.currentTimeMillis()+60000))//token过期时间.setId(“用户ID”)//用户ID

    2022年5月21日
    36
  • 2020年前端面试题及答案_结构化面试题库及答案

    2020年前端面试题及答案_结构化面试题库及答案1、javascript基本数据类型?string、number、null、underfined、booleanobject是所有对象的父对象。2、浅谈javascript中变量和函数声明的提升?变量和函数声明的提升会被提升到最顶部去执行;函数的提升高于变量的提升;如果在函数内部用var声明了与外部相同的变量,则不向下寻找;匿名函数不会被提升;不同块中互不影响。3、什么是闭包?闭包有什么特性?闭包就是能够读取其他函数内部变量的函数。闭包的特性:函数内部可以嵌套函数;内部函数可以直接

    2022年8月27日
    3
  • Java面向对象的三大特征以及理解

    Java面向对象的三大特征以及理解Java面向对象的三大特征为:封装、继承和多态,本文说说我对三大特性的理解。1.封装Java中的封装是指一个类把自己内部的实现细节进行隐藏,只暴露对外的接口(setter和getter方法)。封装又分为属性的封装和方法的封装。把属性定义为私有的,它们通过setter和getter方法来对属性的值进行设定和获取。下面我举一个简单的封装例子publicclassPerson{priva…

    2022年7月25日
    6
  • mysql 建前缀索引_MySQL_前缀索引_建立[通俗易懂]

    mysql 建前缀索引_MySQL_前缀索引_建立[通俗易懂]–查看出现频率selectcount(*)ascnt,cityfromsakila.city_demogroupbycityorderbycntdesclimit10;1.selectcount(distinctcity)/count(*)fromsakila.city_demo;*完整列的选择性2.selectcount(distinctleft(ci…

    2022年5月10日
    38
  • 11.1JS笔记_数据结构手写笔记

    11.1JS笔记_数据结构手写笔记11.1JS笔记

    2022年4月20日
    61

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号