热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

计算机有符号数加法,有符号数的表示法、加减法、补码

有符号数的表示法、加减法、补码摘要:本文将会说明有符号数的表示方法,有符号数正负数之间的跳变,有符号负数的加减法,为什么采用补码等方面进行分析。我是学过计算机原理的,也有有符号数和

有符号数的表示法、加减法、补码

摘要:本文将会说明有符号数的表示方法,有符号数正负数之间的跳变,有符号负数的加减法,为什么采用补码等方面进行分析。

我是学过计算机原理的,也有有符号数和无符号数的概念,以及正码、反码、补码的概念。可是我今天在看C++primer

plus时仍然对讲解的有符号数之间的跳变搞蒙了。原因是我只是有了概念,当初学习没有深入的去问为什么计算机会这么处理有符号的数据。那么好吧,现在就得补回来。

有符号数

有符号数的概念当然就是,用一个比特表示正负了,很明显是这样,比如:+8为00001000,-8就是10001000(这里呢就用8位的长度表示数值),可见在+8和-8的二进制有符号表示的时候差别就在首位字节,就是第一个比特了。这就是有符号数。

为什么要用有符号数?

我想应该是数学逻辑中就是有正负的,而计算机作为数据处理的工具当然要可以表示数据的正负,所以这是很显然的事情。

有符号数带来的问题

正负的表示问题我们是解决了,可是光表示了是不行的,我们的目的还是用来运算的。那么问题来了。

引入了一个符号位,其表示数值的范围是多少?

8位的数据的二进制范围是,00000000-11111111,即十进制的0-255,。有符号数的首位可是有含义的,所以二进制仍然是00000000-11111111,但是十进制的范围就成了,-128-+127,就是-128到+127,然而这是有问题的,什么问题?有没有想过0该这么表示,10000000(-0)还是00000000(+0)。这的确是个问题,如果有了正负0那么取值的范围很明显就是-127到+127了嘛,中间有两个正负0。当然严谨的计算机科学家是不允许的,所以只能有一个表示十进制的0,那就是00000000,可是10000000表示个啥?规定表示为-128,这样就解决了两个0的问题,而且取值的范围就是-128到+127。

有符号数之间的跳变?

什么事跳变,其实就是溢出,什么又是溢出,其实就是数值的超出了范围。举个例子,8位有符号数范围我们是知道了就是-128到+127,但是当我超出了+127时会怎样?看一下

+127

+ 1

——

=+128

十进制来看是这样的,但是+128已经超出了表示的范围了。那么跳变就出现了。通过二进制看一下

01111111(+127)

+00000001( +1)

—————-

=10000000(-128)

二进制相加的结果是10000000,从前面的定义我们知道它是-128。这就是溢出了,发生了跳变。在工程中我们一定要避免这种事情的,因为它不是我们期望的数值。所以搞清楚每个类型的取值的范围是必要的。

这种跳变我不知道工程中会不会用到,但是我是不想用到的,因为不符合常规逻辑。

有符号数的加法

前面也用到了有符号数的加法,在正数时,不超过+127范围时还是正常的,该是几就是几。超出就是负数了,那么我们讨论一下负数的加法。

先说-128吧。

(-128)

+ (+1)

———

=-127

没毛病,十进制是这样的。二进制又是这么样的?

10000000(-128)

+00000001 (+1)

—————-

=10000001(-1)

以下是重点

结果怎么是这样呢?怎么会是-1而不是-127呢?跟我想的不一样,很不开心。可是不开心是没有用的,我们仍然要解决问题。怎么解决?

1、改变加法器。因为正数的加法器不适用于负数的加法运算。这是一个方案,可是这会导致正数和负数用了两个加法器,如果硬件做加法,那就会增加电路负担,有没有可以通过软件解决的?

2、改变表示方式。什么意思?就是说-128在计算机中并不是用10000000存储,而是其他的,怎么表示呢?把负数表示成什么0减去一个正数?试试看

-128为0-128,100000000(9位,理解为向第9位借了一位1)-10000000=11111111+00000001-10000000=100000000

-127为0-127,100000000(9位,理解为向第9位借了一位1)-01111111,即11111111+00000001-01111111=10000001

这样看起来真是是对的了!这样为什么是可以的?

1、两边是恒等式,因为两边都有向第9位借了1位,其实就是两边都加了一个数。即,

-128+1=-127可以表示为(256-128)+1=(256-127),二进制表示为

[(11111111+00000001)-10000000]+00000001=[(11111111+00000001)-01111111]=10000001。

2、这样做其实是把有符号数转变成了无符号数的运算,即把-128转换为了无符号数10000000,注意这里其实并不是-128。我想表达的意思是在运算的时候不要把首位比特当做字符了。其实在转换的时候用到减法运算,这样的目的呢就是在数值上不区分正负,而在转换的运算符中考虑了。所以会是这样。

其实这个转换呢就是补码,这是我参考了别的博文,自己理解的补码的由来,很多教科书都会将到补码的计算公式,然而却并不去讲这个的由来,大多数学生也都是选择了死记硬背,先记住再说,然后就没有再说了,这样真的不好。

参考文献:


推荐阅读
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • qt学习(六)数据库注册用户的实现方法
    本文介绍了在qt学习中实现数据库注册用户的方法,包括登录按钮按下后出现注册页面、账号可用性判断、密码格式判断、邮箱格式判断等步骤。具体实现过程包括UI设计、数据库的创建和各个模块调用数据内容。 ... [详细]
  • “你永远都不知道明天和‘公司的意外’哪个先来。”疫情期间,这是我们最战战兢兢的心情。但是显然,有些人体会不了。这份行业数据,让笔者“柠檬” ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 无线认证设置故障排除方法及注意事项
    本文介绍了解决无线认证设置故障的方法和注意事项,包括检查无线路由器工作状态、关闭手机休眠状态下的网络设置、重启路由器、更改认证类型、恢复出厂设置和手机网络设置等。通过这些方法,可以解决无线认证设置可能出现的问题,确保无线网络正常连接和上网。同时,还提供了一些注意事项,以便用户在进行无线认证设置时能够正确操作。 ... [详细]
  • 本文介绍了游戏开发中的人工智能技术,包括定性行为和非定性行为的分类。定性行为是指特定且可预测的行为,而非定性行为则具有一定程度的不确定性。其中,追逐算法是定性行为的具体实例。 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 本文详细介绍了相机防抖的设置方法和使用技巧,包括索尼防抖设置、VR和Stabilizer档位的选择、机身菜单设置等。同时解释了相机防抖的原理,包括电子防抖和光学防抖的区别,以及它们对画质细节的影响。此外,还提到了一些运动相机的防抖方法,如大疆的Osmo Action的Rock Steady技术。通过本文,你将更好地理解相机防抖的重要性和使用技巧,提高拍摄体验。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 无损压缩算法专题——LZSS算法实现
    本文介绍了基于无损压缩算法专题的LZSS算法实现。通过Python和C两种语言的代码实现了对任意文件的压缩和解压功能。详细介绍了LZSS算法的原理和实现过程,以及代码中的注释。 ... [详细]
author-avatar
我想飞
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有