【计算机组成原理】详细解读带符号整数在计算机中的运算

news2024/11/15 21:38:51

有符号整数的运算

  • 导读
  • 一、补码的优势
  • 二、补码的加法运算
  • 三、补码的减法运算
  • 四、原码、反码、补码的特性
  • 结语

封面

导读

大家好,很高兴又和大家见面啦!!!

经过前面的介绍,我们已经初步认识了有符号整数的三种表示形式:

  • 原码——用机器数的最高位表示符号,其余位表示数值。
    • 符号位为0,表示正数
    • 符号位为1,表示负数
    • n n n 位机器数对应的取值范围: − ( 2 n − 1 − 1 ) ~ 2 n − 1 − 1 -(2^{n-1}-1)~2^{n-1}-1 (2n11)2n11
  • 反码——原码符号位不变,数值位按位取反。
    • 反码常用于数码变换的中间表示形式
    • n n n 位机器数对应的取值范围: − ( 2 n − 1 − 1 ) ~ 2 n − 1 − 1 -(2^{n-1}-1)~2^{n-1}-1 (2n11)2n11
  • 补码——反码+1
    • 有符号整数在计算机中的存储形式
    • 补码的符号位参与运算
    • n n n 位机器数对应的取值范围: − 2 n − 1 ~ 2 n − 1 − 1 -2^{n-1}~2^{n-1}-1 2n12n11

在接下来的内容中,我们将会进一步的深入探讨原、反、补这三种表现形式的内容。今天我们将会从最简单的有符号整数的运算开始介绍。

在前面我们有提到过,有符号整数在通过原码进行运算时,会存在一些问题:

  • 两个不同符号的加法运算(或同符号的减法运算),需要完成三步运算:
    • 比较两个值的绝对值大小
    • 用绝对值大的数减去绝对值小的数
    • 给运算结果选择合适的符号
  • 两个同符号的加法运算(或不同符号的减法运算),需要完成三步运算:
    • 减法运算改为加法运算,即加上被减数的相反数
    • 从右到左,数值位逐位相加,符号位不参与运算
    • 符号位取左操作数的符号

可以看到,同样是加减法运算,仅仅因为加减法的对象不同,其运算的方式却有差异,为了提高运算的效率,降低硬件的开发成本,于是便有了补码,那么在有符号的整数中,其补码形式又是如何进行运算的呢?下面我们就一起来探讨一下补码的加减运算;

一、补码的优势

在原码的运算中,由于机器数的最高位表示的是符号位,并且符号位不参与运算,因此实际在进行运算的只有除符号位以外的数值位,而运算结果的符号,还需要根据结果进行判断,这就导致其运算过程变的及其复杂;

但是在补码的运算中符号位要参与运算,此时我们就不需要再去考虑结果的符号,正常的完成运算后,运算结果的符号也就同时确定了下来,这样就大大降低了运算的难度。

而且真值0的原码表示有 [ + 0 ] 原 = 0 , 0000 [+0]_原=0,0000 [+0]=0,0000 [ − 0 ] 原 = 1 , 0000 [-0]_原=1,0000 [0]=1,0000 两种形式,而在补码中,真值0的补码只有 [ 0 ] 补 = 0 , 0000 [0]_补=0,0000 [0]=0,0000 一种形式,并且补码相比于原码还能够多表示一位负数 − 2 n − 1 -2^{n-1} 2n1

从这几点来看,有符号整数以补码的形式进行存储,并通过补码运算的优势还是很明显的。

二、补码的加法运算

有符号整数的补码加法规则很简单,从右到左,依次相加,逢二进一,如下所示:

补码的加法
可以看到,整个过程并不复杂,并且这个过程有细心的朋友就会发现,除了后续的补码转换成原码之外,整个加法运算的过程是和无符号整数的加法是一样的。那么这个补码的运算是否和无符号整数的运算有联系呢?

在无符号整数的运算中我们就有介绍过,计算机中,减法电路的造价会高于加法电路的造价,因此,为了节约开发成本,计算机中的减法都会以加法的形式来完成,这里就包括有符号整数的加法。

那在有符号整数中的减法是如何实现的呢?下面我们就来继续探讨一下有符号整数的减法;

三、补码的减法运算

有符号整数的减法实际上和无符号整数的减法一样,在式子 A − B A-B AB 中都是选择将减数 B B B 按位取反,末位+1,注意这里的按位取反是连同符号位一起按位取反,如下所示:

补码的减法
当完成转换后我们会发现,最终得到的这个数值应该是减数的相反数,为什么会这样呢?

其实这里很好理解,我们要注意看减数的这一步转换是如何执行的:

  • 先转换数值位:按位取反,末位+1,这个一步转换获取的减数对应的原码
  • 再转换符号位:按位取反,此时负数变成了正数

这么一看,经过这一步换算之后,原数的相反数了吗。这时有朋友就会说了,你这是负值的转换,当然没问题了,那正值呢?

这个问题问的非常好,对于正数而言,它的转换过程如下所示:

  • 先转换符号位:按位取反,此时整数变成了负数
  • 再转换数值位:按位取反,末位加1,此时获取的是负数的补码

补码的减法

从正数的转换来看,我们把这种转换成为获取减数的相反数似乎是不太准确的,更准确的说法应该是相反数的补码:

  • 正数:获取的是其对应负数的补码
  • 负数:获取的是其对应正数的补码

在完成转换后,此时的减法也就变成了加法,其运算规则为:从右到左,逐位相加,逢二进一。

现在大家有发现什么吗?

没错,当有符号整数以补码的形式进行运算时,其运算的过程与无符号整数的运算是一致的,也就是说,用补码的形式来存储有符号整数,在进行运算的时候,可以使用同一个电路来完成无符号整数和有符号整数的运算,而且还是使用造价低的加法电路,

四、原码、反码、补码的特性

接下来我们就来对原码、反码、补码的特性做个总结,以机器数为n位的机器为例,下面我们会从不同的方面来进行对比:

  • 真值0的表示形式
    • 原码:两种表示形式: [ + 0 ] 原 = 0 , 0000 [+0]_原 = 0,0000 [+0]=0,0000 [ − 0 ] 原 = 1 , 0000 [-0]_原 = 1,0000 [0]=1,0000
    • 反码:两种表示形式: [ + 0 ] 反 = 0 , 1111 [+0]_反 = 0,1111 [+0]=0,1111 [ − 0 ] 反 = 1 , 1111 [-0]_反 = 1,1111 [0]=1,1111
    • 补码:一种表示形式: [ 0 ] 补 = 0 , 0000 [0]_补 = 0,0000 [0]=0,0000
    • 无符号整数:一种表示形式: 000 … 000 000…000 000000
  • 最大值:
    • 原码: 2 n − 1 − 1 2^{n-1}-1 2n11
    • 反码: 2 n − 1 − 1 2^{n-1}-1 2n11
    • 补码: 2 n − 1 − 1 2^{n-1}-1 2n11
    • 无符号整数: 2 n − 1 2^n-1 2n1
  • 最小值:
    • 原码: − ( 2 n − 1 − 1 ) -(2^{n-1}-1) (2n11)
    • 反码: − ( 2 n − 1 − 1 ) -(2^{n-1}-1) (2n11)
    • 补码: − 2 n − 1 -2^{n-1} 2n1
    • 无符号整数: 0 0 0
  • 取值范围:
    • 原码: − ( 2 n − 1 − 1 ) ~ 2 n − 1 − 1 -(2^{n-1}-1)~2^{n-1}-1 (2n11)2n11
    • 反码: − ( 2 n − 1 − 1 ) ~ 2 n − 1 − 1 -(2^{n-1}-1)~2^{n-1}-1 (2n11)2n11
    • 补码: − 2 n − 1 ~ 2 n − 1 − 1 -2^{n-1}~2^{n-1}-1 2n12n11
    • 无符号整数: 0 ~ 2 n − 1 0~2^n-1 02n1
  • 运算方式:
    • 原码:数值位运算,符号位不参与运算
    • 反码:不参与运算
    • 补码:数值位符号位都参与运算
    • 无符号整数:所有二进制位都参与运算

结语

今天的内容到这里就全部结束了,在下一篇内容中我们将介绍《移码》的相关内容,大家记得关注哦!如果大家喜欢博主的内容,可以点赞、收藏加评论支持一下博主,当然也可以将博主的内容转发给你身边需要的朋友。最后感谢各位朋友的支持,咱们下一篇再见!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2130382.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用ShardingSphere实现MySql的分库分表

目录 一 什么是ShardingSphere分库分表 二 代码实现 1.导入相关依赖 2.配置相关参数 3.创建学生类以及mapper接口 4.实现 StandardShardingAlgorithm接口自定义分片算法 唐洋洋我知道你在看!!!嘿嘿 一 什么是ShardingSphere分库分表 我们平时在设计数据库的时候&#xf…

Servlet入门学习笔记-Servlet技术

为什么需要Servlet ? 使用JSP技术如何编写服务器动态网页? 流程图:JSP使用Java生成动态内容 在JSP技术出现之前如何编写服务器动态网页? 流程图:Java代码就是Servlet程序 什么是Servlet ? Servlet 是一个…

sqli-labs靶场自动化利用工具——第10关

文章目录 概要整体架构流程技术细节执行效果小结 概要 Sqli-Labs靶场对于网安专业的学生或正在学习网安的朋友来说并不陌生,或者说已经很熟悉。那有没有朋友想过自己开发一个测试脚本能实现自动化化测试sqli-labs呢?可能有些人会说不是有sqlmap&#…

YoloV10改进策略:Block改进|PromptIR(NIPS‘2023)|轻量高效,即插即用|(适用于分类、分割、检测等多种场景)

文章目录 摘要代码详解如何在自己的论文中描述摘要 本文使用PromptIR框架中的PGM模块来改进YoloV10。PGM(Prompt Generation Module)模块是PromptIR框架中的一个重要组成部分,主要负责生成输入条件化的提示(prompts)。这些提示是一组可学习的参数,它们与输入特征相互作用…

【Java】方法的重载

文章目录 前言一、方法重载是什么?二、方法重载的注意事项 1、一个类中,只要一些方法的名称相同,形参列表不同,那么它们就是方法重载了,其他的不管(如:修饰符,返回值类型是否一样都无…

彻底学会防抖和节流

目录 防抖(Debounce) 节流(Throttle) 如何选择使用防抖和节流? 总结 Vue 3 中使用防抖(Debounce)和节流(Throttle) 防抖(Debounce)示例 节…

普发Pfeiffer TCP600TCP5000手侧

普发Pfeiffer TCP600TCP5000手侧

unity3d入门教程三

unity3d入门教程三 8.1游戏脚本8.2脚本的使用8.3认识脚本组件8.4帧率9.1游戏脚本9.2获取节点和组件9.3MonoBehaviour9.4父节点与子节点9.5组件的属性9.6脚本的单步调试 8.1游戏脚本 通过程序控制对象属性(如运动,修改transform的位置属性) …

【STM32】VOFA+上位机 PID调参

【STM32】VOFA上位机 PID调参 前言VOFA简介 VOFA配置VOFA动态调节PID参数VOFA控件STM32解析数据包 PID参数整定一般调节法临界比例法试凑法 前言 参考文章如下:VOFA使用说明 使用VOFA上位机进行PID调参 PID参数整定 VOFA VOFA是一款简单易上手的上位机调试软件&a…

vue之我不会

计算属性 例子&#xff1a; 注意&#xff1a;调用计算属性时&#xff0c;不可以带括号&#xff0c;那样调用的就是方法&#xff0c;如&#xff1a;以下调用fullName时不可funnName() <div id"root">姓&#xff1a;<input type"text" v-model"…

Go语言练习——语法实践

目录 一、数组 1.多维数组的声明和使用 2.数组与切片的转换 3.数组在函数中的使用 二、切片 1.切片的动态扩容机制 2.切片的复制与修改 3.切片在排序算法中的应用 三、结构体 1.结构体的嵌套与方法 2.结构体与JSON的序列化 3.结构体的工厂模式 四、映射 1.映射的并发访问 2.映射…

erlang学习: Mnesia Erlang数据库4

表的类型和位置 内存表 它们的速度非常快&#xff0c;但是里面的数据是易失的&#xff0c;所以如果机器崩溃或者你停止了DBMS&#xff0c;数据就会丢失。 磁盘表 磁盘表应该不会受到系统崩溃的影响&#xff08;前提是磁盘没有物理损坏&#xff09;。 当Mnesia事务写入一个表并…

Qt如何链接和使用第三方库详解

在开发Qt应用程序时&#xff0c;我们经常会遇到需要使用第三方库的情况。无论是为了实现特定的功能&#xff0c;还是为了提高开发效率&#xff0c;使用第三方库都是一个非常常见的做法。本文将详细介绍如何在Qt项目中链接和使用第三方库。 基本步骤 配置Qt项目 在Qt项目中使…

Java | Leetcode Java题解之第402题移掉K位数字

题目&#xff1a; 题解&#xff1a; class Solution {public String removeKdigits(String num, int k) {Deque<Character> deque new LinkedList<Character>();int length num.length();for (int i 0; i < length; i) {char digit num.charAt(i);while (!…

最新免费云服务器,有需要的自行领取

目前云服务器市场竞争很激烈&#xff0c;为了吸引用户上云&#xff0c;很多云服务器提供商都提供了相应的免费试用活动&#xff0c;这些活动旨在帮助用户体验其服务和产品。 以下是一些值得关注的最新免费云服务器资源及其特点&#xff1a; 一、雨云 活动地址&#xff1a;点此…

MBD_入门篇_24_SimulinkSources

24.SimulinkSources 24.1 概述 Source库里面是Simulink的产生或输入信号数据的模块&#xff0c;要么用于产生信号要么用于传递上层的信号进来要么接地。用来生成代码的模块并不是很多&#xff0c;大部分都是用来仿真的。 Source库里面的模块都只有输出&#xff0c;没有输入。…

用Unity2D制作一个人物,实现移动、跳起、人物静止和动起来时的动画:下(人物动画)

上个博客我们做出了人物的动画机和人物移动跳跃&#xff0c;接下来我们要做出人物展现出来的动画了 我们接下来就要用到动画机了&#xff0c;双击我们的动画机&#xff0c;进入到这样的页面&#xff0c;我这是已经做好的页面&#xff0c;你们是没有这些箭头的 依次像我一样连接…

大数据安全之Kerberos

Kerberos 是一个网络身份验证协议&#xff0c;旨在提供强身份验证&#xff0c;尤其是在开放网络环境中。它最早由麻省理工学院&#xff08;MIT&#xff09;开发&#xff0c;用于在不安全的网络环境中安全地验证用户身份。Kerberos 协议的设计旨在防止窃听、重放攻击和网络中的其…

工作分享,中芯国际招聘,附送內推码

內推码&#xff0c;中芯国际 &#x1f4da;【简介】&#xff1a;中芯国际(证券代码:00981.HK/688981.SH)是世界领先的集成电路晶圆代工企业之一&#xff0c;也是中国大陆集成电路制造业领导者 【详情】&#xff1a;https://nuaa.91job.org.cn/sub-station/announcementDetail…

keras和tensorflow可用的一组版本

目录 keras版本&#xff1a;3.5.0tensorflow&#xff1a;2.17.0之前的错误导包现在的正确导包 keras版本&#xff1a;3.5.0 tensorflow&#xff1a;2.17.0 之前的错误导包 其实也不是说错误&#xff0c;就是因为文件位置不对&#xff0c;所以VSCode总是有黄色波浪线&#xff0…