【新书推荐】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汇编语言基础教程》。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】类和对象(中篇)(全网最细!!!)

文章目录 🍔一、类的六个默认成员函数🍔二、构造函数🍟1、概念🍟2、特性🍩默认构造函数 🍔三、析构函数🍟1、概念🍟2、特性🍩默认析构函数 🍔四、拷贝构造函数…

单片机开发板-硬件设计

开发板设计 1> 概述2> 功能2.1> GPIO类2.2> 通信类2.3> 显示类 3> 测试 1> 概述 开发板的定位:学会单片机; 目的越单纯,做的东西越好玩; 51开发板:DAYi STM32F103开发板:DAEr STM32F…

项目中从需求分析到研发上线

一、背景 应用系统从设想到需求到研发到上线会经历一些列工程化过程。比如经典的瀑布模型工作流,其实就是一个经过很多经验总结下来的工程方法。本节阐述项目中从需求到研发上线的过程。但是也有些根据不同的行业,不同的公司,不同管理者的风…

Go 知识for-range

Go 知识for-range 1. for-range 的用法1.1 数组1.2 切片1.3 字符串1.4 map1.5 chan 2. 原理2.1 数组2.2 切片2.3 字符串2.4 map2.5 chan 3. 总结 https://a18792721831.github.io/ 1. for-range 的用法 for-range 表达式用于遍历集合元素,比传统的for更加简单直观…

【微信小程序】15分钟倒计时(附带天数和时钟的实现方法在文章中)

这是制作的订单支付前倒计时,如果客户在规定时间内没能 支付,则系统自动删除,这样就以便有些商品冗余,当然了,这里只有分钟和秒钟,天数和时钟我写在了最底下,最后代码的显示第七行,可…

C++:引用

目录 概念: 引用的使用格式: 引用特性: 常引用 使用场景: 1、做参数 二级指针时的取别名 一级指针取别名 一般函数取别名 2、做返回值 函数返回值的原理: 引用的返回值使用: 引用和指针的对比&…

搭建AI问答和AI绘画小程序都需要做什么?

1、注册和认证小程序 在微信公众平台 注册,选择小程序类别即可。根据提示提交企业相关资质文件即可,注册后进行认证小程序,官方会收取300元认证费用。也可以私信我可以免掉300元认证费。 2、开通微信商家支付 认证通过后,在“功…

uniapp 使用echarts做折线图条形图。

提前10天把中烟活动做完了,以为能打酱油到除夕那天,结果又要做什么数据看板,方便烟草领导过年查看数据,还只给5天时间,真实压榨剥削啊,下辈子再也不‘拍黄片’了,不!下份工作我就转前…

MySQL:函数

基本介绍 在MySQL中,为了提高代码重用性和隐藏实现细节,MySQL提供了很多函数。函数可以理解为别人封装好的模板代码。 在MySQL中,函数非常多,主要可以分为五类:聚合函数、数学函数、字符串函数、日期函数、控制流函数、…

Maven讲解

介绍 Maven是一个流行的构建工具和项目管理工具,它主要用于Java项目的构建、依赖管理和项目报告生成。Maven通过提供一致的项目结构、自动化的构建过程和强大的依赖管理,简化了项目的开发和维护过程。 下面是一些Maven的主要特点和用途: 项…

【算法】Knuth-Morris-Pratt 算法(KMP算法):一种在字符串中查找子串的算法

引言 KMP(Knuth-Morris-Pratt)算法是一个在字符串中查找子串的算法,由 Donald Knuth、Vaughan Pratt 和 James H. Morris 共同发明。这个算法的特点是在查找过程中,不会回溯主串,也不会重复扫描已经比较过的子串&…

2024年上海高考数学最后四个多月的备考攻略,目标140+

亲爱的同学们,寒假已经来临,春节即将到来,距离2024年上海高考已经余额不足5个月了。作为让许多学子头疼,也是拉分大户的数学科目,你准备好了吗?今天,六分成长为您分享上海高考数学最后四个多月的…

2024 高级前端面试题之 JS 「精选篇」

该内容主要整理关于 JS 的相关面试题,其他内容面试题请移步至 「最新最全的前端面试题集锦」 查看。 JS模块精选篇 1. 数据类型基础1.1 JS内置类型1.2 null和undefined区别1.3 null是对象吗?为什么?1.4 1.toString()为什么可以调用&#xff1…

燃烧的指针(三)

🌈个人主页:小田爱学编程 🔥 系列专栏:c语言从基础到进阶 🏆🏆关注博主,随时获取更多关于c语言的优质内容!🏆🏆 😀欢迎来到小田代码世界~ &#x…

为什么需要使用线程池来创建线程?

当我们使用new Thread无限创建线程的时候 因为频繁的创建线程和销毁线程,cpu利用率会非常高 当cpu利用率达到100%的时候 那么没有可用的资源 让其他进程使用 那么其他进程访问就会导致卡顿 访问速度变慢 当我们使用线程池的时候 ,cpu利用率就会降低&…

市场复盘总结 20240126

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整,采用龙空龙模式 昨日主题投资 连板进级率 27/105 25.7% 二进三: 进级率低 50% 最常用的二种方法: 方…

2024最新版Visual Studio Code安装使用指南

2024最新版Visual Studio Code安装使用指南 Installation and Usage Guide for the Latest Visual Studio Code in 2024 By JacksonML Visual Studio Code最新版1.85已经于2023年11月由其官网 https://code.visualstudio.com正式发布,这是微软公司2024年发行的的最…

vs2019报错MSB4019 找不到导入的项目“BuildCustomizations\CUDA 9.2.props”

在VS中执行生成,报错如下:严重性 代码 说明 项目 文件 行 禁止显示状态 错误 MSB4019 找不到导入的项目“D:\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\BuildCustomizations\CUDA 9.2.props”。请确认 Import 声明“D:\Microso…

Mybatis----分页

1.什么是分页 分页(Pagination)是指将大量数据划分为多个页面进行展示的一种技术手段。在数据量较大的情况下,将所有数据一次性显示在页面上会导致加载时间过长和页面过于庞大,影响用户体验和系统性能。分页技术通过划分数据为多…

Mac Monitor:一款为macOS安全研究量身定制的高级独立系统监控工具

关于Mac Monitor Mac Monitor是一款功能强大的高级独立系统安全监控工具,该工具专为macOS安全研究、恶意软件分类和系统故障排除而设计,主要基于Apple Endpoint Security(ES)实现其功能。 Mac Monitor能够收集各种类型的系统事件…