【新书推荐】2.6节 原码、反码和补码
回顾上一节中,我们讲解了整数的编码规则。
无符号整数编码规则:无符号整数全部都是正数,是什么就存什么。
有符号整数编码规则:有符号整数最高有效位为0是正数,最高有效位为1是负数。
本节内容:原码、反码和补码。
■为什么要有原码、反码和补码:8086 CPU只有加法电路,通过加法电路实现减法、乘法和除法运算。将减法转换为加法运算需要将负数转换为补码,如1-2=1+(-2),-2以其补码形式存储。因此,只有负整数存在原码、反码和补码。
■原码、反码、补码的定义:原码——最高位为符号位,其余各位为数值本身的绝对值。反码——符号位不变,其余各位取反。补码——符号位不变,其余各位取反后加1。
■原码、反码、补码的转换规则:首先指定数据宽度,然后按照定义的规则进行转换。记住圆形数据范围内,左半圆为负整数,右半圆为正整数。
2.6.1 为什么要有原码、反码、补码
由于早期的8086 CPU只支持加法指令,减法、乘法和除法都是通过加法指令实现的。例如:减法运算2-3=?等价于加法运算2+(-3)=?那么剩下的问题就是如何在计算机内存储有符号整数值“-3”。这就需要用到原码、反码和补码的编码规则了。
注意
当算术运算表达式中的两个整数都是无符号整数或者有符号整数的正整数时,不存在减法转加法运算的问题。即原码、反码和补码仅针对于有符号整数的负整数。
再次强调,数据定义一定要指明数据的宽度。
2.6.2 原码、反码、补码的定义
■原码:最高位为符号位,(“0”代表正数,“1”代表负数)其余各位为数值本身的绝对值。
■反码:
正数:反码与原码相同,这是规定。
负数:符号位为1不变,其余位对原码取反。
■补码:
正数:补码与原码相同。
负数:符号位为1不变,其余位对原码取反加1。
举例
例1:写出有符号整数1(8位数据宽度)的原码、反码、补码。
原码:0000 0001 反码:0000 0001 补码:0000 0001
例2:写出有符号整数-1(8位数据宽度)的原码、反码、补码。
原码:1000 0001 反码:1111 1110 补码:1111 1111=>FF
例3:写出有符号整数-7(8位数据宽度)的原码、反码、补码。
原码:1000 0111 反码:1111 1000 补码:1111 1001=>F9
例4:写出有符号整数F9(8位数据宽度)的原码、反码、补码。
原码:1111 1001 反码:1000 0110 补码:1000 0111=>-7
例3和例4,-7的补码是F9,F9的补码是-7,即补码的补码等于自身。
2.6.3 原码、反码和补码的转换规则
■假设数据宽度为1 BYTE(8 BIT)
图2-22 BYTE数据类型存储范围
如图2-22所示:
无符号数:0 1 2 3 4 ......FF
有符号数:
正数:0 .......7F
负数:FF ........80
■假设数据宽度为Doubleword(32BIT)
图2-23 Dword数据类型存储范围
如图2-23所示:
无符号数:0 1 2 3 4 ......FFFFFFFF
有符号数:
正数:0 .......7FFFFFFF
负数:FFFFFFFF ........80000000
■有符号数的编码规则
如果是正数,不变。
如果是负数,分析图2-24所示左右两个半圆部分。
图2-24 32位整数数据范围
分析图2-24有符号整数:
第8位 | 第7位 | 第6位 | 第5位 | 第4位 | 第3位 | 第2位 | 第1位 | |
0XBFFFFFFF | 1011 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 |
0X40000000 | 0100 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 |
表2-9 反码对照表
表2-9中举例说明:圆的左右两边对应的整数互为反码。
■补码为什么要+1
表2-10 4位有符号数-1~-8原码反码补码
表2-11 8位有符号数-1~-8原码反码补码
注意:最高位符号位不参与运算。
表2-10和表2-11分别展示了4位和8位-1~-8的原码、反码和补码的推导过程。符号位不参与运算,保持不变。反码+1后与原码的表示有符号整数值相同。
举例
假设数据宽度为8位。
有符号数-1的补码为:11111111B。
有符号数-3的补码为:11111101B。
1-1=1+(-1)=[00000001B]+[11111111B]=[00000000B]=0发生进位后,数据溢出,舍弃。
5-3=5+(-3)=[00000101B]+[11111101B]=[00000010B]=2。
总结
1.正整数不存在原码、反码和补码的转换,是什么就存什么。
2.只有负整数存在原码、反码和补码的转换。
3.负整数以补码形式存储到内存中,由编译器实现原码、反码和补码的转换。
4.最高位符号位1不参与取反,也不参与有符号数的算术逻辑运算。
练习
1、为什么要有数据宽度?
2、已知0x9A是一个有符号数,那么请说明它是正数还是负数?
3、分别列出 6、-6、7、-7、8、-8、9、-9、1、-1、0、-0 的原码反码补码。
4、已知数据宽度为8Bit,请通过下面的值得到对应原码:
7F 9A 86 5F 3E A3 B7 5D
5、已知数据宽度为32 Bit,请通过下面的值得到对应原码:
0xFFFFFF 0x81234567
6、有符号的正数是原码存储,有符号的负数是补码存储,那么无符号数呢?
7、当计算机中存储的0x81234时,代表的值是多少?
8、假设有符号数数据宽度为8位,其取值范围是-128~127,请问为何负整数取值比正整数多一个值?
本文摘自编程达人系列教材《X86汇编语言基础教程》。
相关文章:

【新书推荐】2.6节 原码、反码和补码
回顾上一节中,我们讲解了整数的编码规则。 无符号整数编码规则:无符号整数全部都是正数,是什么就存什么。 有符号整数编码规则:有符号整数最高有效位为0是正数,最高有效位为1是负数。 本节内容:原码、反…...

docker 网络及如何资源(CPU/内存/磁盘)控制
安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络)、 none 、host docker网络模式 Host 容器与宿主机共享网络namespace,即容器和宿主机使用同一个IP、端口范围(容器与宿主机或其他使…...

安装 nvm
前言: nvm 即 node 版本管理工具 (node version manager),好处是方便切换 node.js 版本。 通过将多个 node 版本安装在指定路径,然后通过 nvm 命令切换时,就会切换我们环境变量中 node 命令指定的实际执行的软件路径。 使用场景…...

Redis解决方案:NOAUTH Authentication required(连接jedis绑定密码或修改redis密码)
Redis解决方案:NOAUTH Authentication required(连接jedis绑定密码或修改redis密码) Java使用jedis连接redis时出现错误NOAUTH Authentication required 一、问题报错和原因 本地设置了redis的密码,但在远程连接时并没有输入密…...

多维时序 | Matlab实现WOA-TCN-Multihead-Attention鲸鱼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测
多维时序 | Matlab实现WOA-TCN-Multihead-Attention鲸鱼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现WOA-TCN-Multihead-Attention鲸鱼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资料 效…...

如何实现无公网IP实现远程访问MongoDB文件数据库
📑前言 本文主要是如何实现无公网IP实现远程访问MongoDB文件数据库的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是青衿🥇 ☁️博客首页:CSDN主页放风讲故事 &#x…...

华为防火墙USG6000V1的NAT实验
实验拓扑: 之前实验做过,可以翻找之前的博客,各设备ip和接口已配好,均可可ping通防火墙。 实验要求: 一.生产区在工作时间内可以访问dmz区域,仅可以访问http服务器。 二.办公区全天可以访问dmz区域&…...
spark-flink设计思想之吸星大法-1
Spark和Flink都是大数据处理框架,它们的设计思想有一些不同之处。以下是对它们设计思想的简要对比: 数据模型和计算模型: Spark:Spark使用弹性分布式数据集(RDD)作为其核心数据结构。RDD是只读的、不可变的…...

力扣1312. 让字符串成为回文串的最少插入次数
动态规划 思路: 通过插入字符构造回文串,要想插入次数最少,可以将字符串 s 的逆序 s 进行比较找出最长公共子序列;可以先分析,字符串 s 通过插入得到回文串 ps,其中间的字符应该不会变化: 若 s…...

qemu的安装
1、简介 QEMU(Quick EMUlator)是一个开源的处理器模拟器,它可以在一种硬件平台上模拟另一种硬件平台,从而运行各种不同的操作系统。QEMU通过动态二进制翻译来实现高性能的模拟,这使得它可以在接近原生性能的速度下运行…...
myql入门
目录 安装修改密码学习资料个人git仓库文章视频官网 安装 #移除以前的mysql相关 sudo apt remove --purge mysql-\* #安装mysql sudo apt install mysql-server mysql-client #查看是否启动 systemctl status mysql #手动启动 systemctl start mysql #查看mysql版本 mysql --v…...
前端开发有没有必要转鸿蒙开发?
前端开发有没有必要转鸿蒙开发?如果后面的工作中有参与鸿蒙开发的机会,那肯定是转呀!毕竟多接触一些技能也不会有什么坏处。 我想说的是:鸿蒙替代不了前端,如果你目前正在从事前端开发,那么你完全可以将鸿蒙…...
《动手学深度学习(PyTorch版)》笔记1
Chapter1 Introduction 1.1 机器学习的关键组件 data 每个数据集由一个个样本(example, sample)组成,大多时候,它们遵循独立同分布(independently and identically distributed, i.i.d.)。 样本有时也叫做数据点(dat…...
前端工程化之:webpack1-5(配置文件)
一、配置文件 webpack 提供的 cli 支持很多的参数,例如 --mode ,但更多的时候,我们会使用更加灵活的配置文件来控制 webpack 的行为。 默认情况下, webpack 会读取 webpack.config.js 文件作为配置文件,但也可以通过 C…...
代码随想录栈和队列专题二刷复盘day17
栈和队列理论基础 队列是先进先出,栈是先进后出 栈和队列是STL里面的两个数据结构 三个最为普遍的STL版本 1.HP STL其他版本的C STL,一般是以HP STL为蓝本实现出来的,HP STL是C STL的第一个实现版本,且开放源代码 2.P.J.Plauger…...

代码随想录算法刷题训练营day16
代码随想录算法刷题训练营day16:LeetCode(104)二叉树的最大深度 、LeetCode(559)n叉树的最大深度、LeetCode(111)二叉树的最小深度、LeetCode(222)完全二叉树的节点个数 LeetCode(104)二叉树的最大深度 题目 代码 /*** Definition for a binary tree node.* publ…...

【C语言/数据结构】排序(直接插入排序|希尔排序)
🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343🔥 系列专栏:《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 目录 插入排序 直接插入排序&…...

Jupyter Notebook安装使用教程
Jupyter Notebook 是一个基于网页的交互式计算环境,允许你创建和共享包含代码、文本说明、图表和可视化结果的文档。它支持多种编程语言,包括 Python、R、Julia 等。其应用场景非常广泛,特别适用于数据科学、机器学习和教育领域。它可以用于数…...
Unity 中的接口和继承
在Unity的游戏开发中,理解面向对象编程的概念,如类、接口、继承和多态性,是非常重要的。本文旨在帮助理解和掌握Unity中接口和继承的概念,以及如何在实际项目中应用这些知识。 类和继承 在C#和Unity中,类是构建应用程序…...
C++区间覆盖(贪心算法)
假设有n个区间,分别是:[l1,r1], [l2,r2], [l3,r3].....[ln,rn] 从这n个区间中选出某些区间,要求这些区间满足两两不相交,最多能选出多少个区间呢? 基本思路: 按照右端点从小到大排序,再比较左端…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

【深度学习新浪潮】什么是credit assignment problem?
Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...

uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...