在计算机中,为了表示有符号整数(即正数和负数),通常采用二进制补码表示法。二进制补码不仅可以表示负数,还能简化计算机的加法和减法运算。接下来,我们将介绍二进制补码的概念及其计算方法。

原码、反码和补码

在讨论补码之前,我们先了解一下原码和反码的概念。

  1. 原码:直接将一个有符号整数转换为二进制数,最高位表示符号(0 代表正数,1 代表负数)。例如:+5 的原码为 00000101-5 的原码为 10000101

  2. 反码:对于正数,其反码与原码相同;对于负数,除符号位外,其余位取反(0 变为 1,1 变为 0)。例如:+5 的反码为 00000101-5 的反码为 11111010

  3. 补码:对于正数,其补码与原码相同;对于负数,其补码为反码加 1。例如:+5 的补码为 00000101-5 的补码为 11111011

求补码的方法

  1. 求正数的补码:直接将正数转换为二进制数,最高位为 0。
  2. 求负数的补码:先求其绝对值的二进制数,然后取反并加 1。

示例:

求 +5 和 -5 的补码:

+5 的补码:00000101
-5 的补码:先求 +5 的二进制数:00000101,然后取反:11111010,最后加 1:11111011

补码的加法运算

使用补码表示法进行加法运算时,可以将有符号整数的加法统一为无符号整数的加法。计算过程中,如果最高位(符号位)有进位,则忽略该进位。

示例:

计算 +5 和 -3 的和:

+5 的补码:00000101
-3 的补码:11111101 相加:
00000101
+ 11111101
----------
100000010 (最高位有进位,忽略)

结果为 00000010,转换为十进制数为 2。所以,+5 和 -3 的和为 2

从补码还原到原码

为了从补码还原到原码,我们可以根据补码的符号位采取不同的方法:

  1. 如果补码的符号位为 0(正数),则补码即为原码。
  2. 如果补码的符号位为 1(负数),则将补码减 1,然后取反,即可得到原码。

示例:

从补码 11111011 还原到原码:

补码:11111011
减 1:11111010
取反:10000101

原码为 10000101,表示负数 -5

通过学习二进制补码的概念及其计算方法,我们能够更好地理解计算机中有符号整数的表示方式和加减法运算。在后续学习 ARM 汇编的过程中,我们会频繁地使用到补码表示法,因此熟练掌握补码的计算方法至关重要。

推荐阅读:

https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA

https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g

[ARM汇编]计算机原理与数制基础—1.1.3 二进制补码的更多相关文章

  1. python编程基础--计算机原理之硬件基础

    一.寄存器:寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果. 1.寄存器的特性: 1)寄存器位于CPU内部,数量很少,仅十四个: 2)寄存器所能存储的数据不一定 ...

  2. GNU ARM 汇编基础

    ARM GNU汇编基础 0 前言 全文补充提醒: 笔者在阅读ARM官方文档及查阅实际的u-boot源码中的汇编代码后,发现了一些不同于ARM官方文档中的汇编语法,查阅相关资料后,才发现主要由于汇编器的 ...

  3. ARM汇编编程基础之一 —— 寄存器

    ARM的汇编编程,本质上就是针对CPU寄存器的编程,所以我们首先要弄清楚ARM有哪些寄存器?这些寄存器都是如何使用的? ARM寄存器分为2类,普通寄存器和状态寄存器 寄存器类别 寄存器在汇编中的名称 ...

  4. 《深入浅出嵌入式底层软件开发》—1. ARM汇编编程基础

    1.1 ARM CPU寄存器 ARM的汇编编程,本质上就是针对CPU寄存器的编程,所以要搞清楚ARM有哪些寄存器:ARM寄存器分为两类:普通寄存器和状态寄存器:普通寄存器一共有16个,分别为R0——R ...

  5. 计算机原理学习(1)-- 冯诺依曼体系和CPU工作原理

    前言 对于我们80后来说,最早接触计算机应该是在95年左右,那个时候最流行的一个词语是多媒体. 依旧记得当时在同学家看同学输入几个DOS命令就成功的打开了一个游戏,当时实在是佩服的五体投地.因为对我来 ...

  6. ARM汇编指令特点

    根据朱有鹏老师课程笔记整理而来: (汇编)指令是CPU机器指令的助记符,经过编译后会得到一串1 0组成的机器码,由CPU读取执行. (汇编)伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器 ...

  7. ARM汇编

    ARM汇编 ISA ISA即指指令集架构(Instruction Set Architecture)是与程序设计有关的计算机架构的一部分,包括本地数据类型.指令.寄存器.地址模式.内存架构.中断和意外 ...

  8. 入门 ARM 汇编(一)—— 知识铺垫

    我读着史铁生的散文,零碎的牵扯起我生命中不曾出现过的记忆,一如北方的黄山厚土之中悠忽而来的忧伤的信天游,那些灿若信仰一样的阳光以及阳光下虔诚的子民.我想有一次远行,于细碎流淌的时光与路途之中,观察所有 ...

  9. iOS 逆向之ARM汇编

    最近对iOS逆向工程很感兴趣. 目前iOS逆向的书籍有: <Hacking and Securing IOS Applications>, <iOS Hacker's Handboo ...

  10. 大脸猫讲逆向之ARM汇编中PC寄存器详解

    i春秋作家:v4ever 近日,在研究一些开源native层hook方案的实现方式,并据此对ARM汇编层中容易出问题的一些地方做了整理,以便后来人能有从中有所收获并应用于现实问题中.当然,文中许多介绍 ...

随机推荐

  1. 在 Vue 中控制表单输入

    Vue中v-model的思路很简单.定义一个可响应式的text(通常是一个ref),然后用v-model="text"将这个值绑定到一个input上.这就创造了一个双向的数据流: ...

  2. Nordic nRF52系列/nRF5340硬件设计(一)选型及原理图设计

    Nordic 的BLE系列芯片从第一代的nRF51系列,到第二代的nRF52系列,发展到目前最新的第三代的nRF5340.目前市场中使用最多的nRF52系列一共有七款芯片,它们是:nRF52805.n ...

  3. Java设计模式 —— 观察者模式

    16 观察者模式 16.1 观察者模式概述 Observer Pattern: 定义对象之间的依赖关系(一对多),当一个对象的状态发生改变时,其关联的依赖对象均收到通知并自动更新. 观察者模式又称:发 ...

  4. LeeCode 942 增减字符串匹配

    LeeCode 942 题目描述: 由范围 [0,n] 内所有整数组成的 n+1 个整数的排列序列可以表示为长度为 n 的字符串 s ,其中: 如果 perm[i] < perm[i + 1]  ...

  5. 使用Dockerfile构建容器镜像

    Dockerfile官方文档: https://docs.docker.com/engine/reference/builder/ 获取容器镜像的方法 容器镜像是容器模板,通过容器镜像才能快速创建容器 ...

  6. 去中心化金融-Lec2

    Finance Finance is the process that involves the creation, management, and investment of money and f ...

  7. DRF的Serializer组件(源码分析)

    DRF的Serializer组件(源码分析) 1. 数据校验 drf中为我们提供了Serializer,他主要有两大功能: 对请求数据校验(底层调用Django的Form和ModelForm) 对数据 ...

  8. SpringBoot 配置CORS处理前后端分离跨域配置无效问题解析

    前言 浏览器有跨域限制,非同源策略(协议.主机名或端口不同)被视为跨域请求,解决跨域有跨域资源共享(CORS).反向代理和 JSONP的方式.本篇通过 SpringBoot 的资源共享配置(CORS) ...

  9. API网关:开源Apinto网关-上游服务篇(二)

    功能介绍 服务发现是一种分布式系统中的关键技术,它能够帮助应用程序动态地发现和访问依赖的服务实例,解决了服务实例分布在不同节点上的问题.通过服务发现,应用程序可以快速找到需要调用的服务实例的位置和元数 ...

  10. Locust 运行方式

      命令参数方式运行 # -*- coding: utf-8 -*- from locust import TaskSet, task, User ''' 命令行参数运行示例代码 ''' class ...