原码和补码在计算机中的应用,二进制、原码、反码和补码详解

2023-10-27

原码反码和补码都是计算机中表示数字的一种编码,维基百科上说

编码是信息从一种形式或格式转换为另一种形式的过程。

其实,计算机内部使用二进制,n位的二进制一共可以表示2^n个不同的数字,至于具体哪个二进制序列对应哪个数字,原则上可以随意。

例如,我们可以编码 00代表数字2  01代表数字3 10代表7 11代表9 ……

c2a138391a7c63120d37616d4e16575a.gif

但是实际应用时,必须考虑到这种编码可以给应用带来方便。相信没有人会设计上图中的编码 ==因为这种编码需要制定每一个数字的编码,而且面对编码根本不知道表示的是哪个数字,只有查表……

从这个扯淡的例子中,我们看到编码必须有一定的规律性,最好能够直接从编码计算得到表示的数字。

二进制数字

计算机采用二进制,而一个数字也可以写成二进制形式,这种一一对应关系恰好可以用于编码。

我们先看一下关于进制的知识:

我们平时使用的数字是十进制,它的全称是10进位计数制,它以10为基数,有0到9 十个符号,进位规律是“逢十进一”,它在表示一个数时,不同的位上的数字的含义是不同的。例如,个位上的3表示3  而十位上的3就表示3*10 。

c2a138391a7c63120d37616d4e16575a.gif

与十进制类似,以2为基数(有两个符号0 1)的进位计数制称为二进制。

我们以二进制数字1011001.1011为例,二进制数字上的每一位的位权如下图所示

c2a138391a7c63120d37616d4e16575a.gif

1011001.1011的十进制形式 为 64 + 16 + 8 + 1 + 1/2 + 1/8 + 1/16 = 89.6875

原码

使用数字的二进制形式在计算机中表示数字,对于一个正数,例如6 ,(6=4+2+0)我们可以很快写出它的二进制形式110 。但是对于负数-6,二进制形式为-110,但是计算机并不认识负数(-)。一个很自然的想法是,用一位二进制0或1分别表示正数和负数(其实也可以用其他方式,只要区分就可以,但这种方式是最方便自然的)。我们把这一个标示符号的为叫做符号位,而数字6的表示部分叫做数值位。

加上符号位之后,6就可以在计算机内表示为0110 ,而 -6可以表示为1110 。(这是用4位表示的情况)

这就是原码,由符号位加上数字绝对值的二进制形式作为数值位表示。

原码对人来说阅读起来十分方便,但是对计算机来说,却有着不少缺点。

原码表示法中,0有两种不同的表示方法0和-0: 以8位表示1个数字为例 0000 0000 和1000 0000都表示0 。这对于计算机来说很不友好,如果判断一个数是不是0要做两次判断。

求两个数的和的时候,如果符号不一致,那么不能直接相加。例如3 + (-4)  用4为2进制表示 就是0011 + 1100 ,如果直接相加 等于1111 这个结果和3+(-4)的正确结果没什么关系。由此可见,符号不相同的时候必须先判断一下两个数的绝对值,绝对值较大的减去较小的,符号是跟绝对值较大的数相同。这样进行加法运算是十分复杂的。

反码

由于用原码计算的时候要单独考虑符号位,比较麻烦,于是人们开始探索将符号位一起进行运算的方法。

反码的定义:正数的反码就是他的原码,负数的反码是他的原码的数值位取反~符号位仍为1.

使用反码表示后,符号位可以一起参与运算,不过有着一些缺点

加法产生进位的时候,要在最低位加上1

0仍有两种表示方式 0000 0000 和 1111 1111

由于这些缺点,反码的应用大大不如补码。

补码

使用原码的时候,正数加负数,实际却要进行减法,而负数减负数,实际却要进行加法,这是十分复杂的。引入补码的目的是方便的实现运算器对于有符号数的加减法运算。

补码是建立在“模”的概念的基础上的。模可以理解为一个量程,一个范围,当运算超出模的范围的时候会循环到最开始。

c2a138391a7c63120d37616d4e16575a.gif

以钟表为例,要把时针从2点移动到4点,既可以顺时针转2小时,也可以逆时针转10小时。

为什么逆时针转10小时也能达到这种效果呢,这就是这种循环特性造成的。

由此我们可以说,对于模12来说

4 = 2 + 2 (mod 12)

4 = 2 +(-10) (mod 12)

也就是说模12的情况下对2进行+2 和 -10 效果是一样的。我们说2和-10对模12互补。

同理,在这个钟表上,-1和+11是一样的,-5和+7的结果是一样的。

所以计算的时候 -6 可以看做+6    -3可以看做+9

再想一下,在这个表上,一个数如果减去一个小余模12的数,相当于加上(12-这个数)

因此,可以把减法转换为加法。

补码和数字之间的映射关系

以3位为例

c2a138391a7c63120d37616d4e16575a.gif

c2a138391a7c63120d37616d4e16575a.gif

3位的二进制可以表示8个数字,其中分为两部分,负数和非负数。0和正数的补码就是它们的原码,而负数的补码就要是它们的绝对值相对于2^4的补码。

-1的绝对值 1 它的补码 就是相对于1 000 来说的补码 1000 – 1 = 111

-2的绝对值 10 它的补码 1000 – 10 = 110

-3的绝对值 11 补码 1000 – 11 = 101

-4的绝对值 100 补码 1000-100=100

用多少个位表示补码,它的模就是1后面有多少个0 。例如用8位表示,它的模就是1 0000 0000 = 2^8

用这个表示的时候 如果计算3-2 ,可以计算3 + (-2)

用他们的补码计算  011 + 110 = 1001 由于只有3位 第4位舍去,结果正好是001 也就是1

补码的计算

补码只是一种相对合理的编码方案,对于人来说可以用补码的形式求出,但是对于计算机来说却不好操作。所以人们又研究出了许多种求补码的方法。

利用定义,也就是负数的补码 = 2^n+1 + x

利用补码=反码+1

扫描方法

将负数的原码或真值转换为补码,可以从最低位开始,到最高位依次扫描,如果没有遇到1 就保持不变(开始的0仍是0) 遇到第一个1后,1后面的各个位数依次取反。最后将最高位符号位置为1.这种方法对人和机器都非常方便。

移码

移码就是将x加上一个常数,相当于在数轴上向右平移了一段距离。

常用的移码距离是2^n 。

c2a138391a7c63120d37616d4e16575a.gif

移码可以这样理解,本来-128 到 127 256个数字都是用-128和127表示,但是经过移码后,-128到127依次映射为0-255

对于补码,它的移码就是最高位翻转,这样0表示负数 1表示正数,利于判断大小,被用在浮点表示中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

原码和补码在计算机中的应用,二进制、原码、反码和补码详解 的相关文章

  • ROS机器人建模与仿真(一)--URDF机器人建模

    前言 经过ROS的保姆级教程之后 相信大家对ROS应该有一个基本的认识了 关于各种工具的使用其实等到真正有所需求之后再去查找即可 roswiki始终是最好的最一手的信息来源 本系列的博客主要用来记录如何让在ROS的环境下进行机器人的建模与仿
  • Oracle,PL/SQL常用函数列表

    常用字符函数 函数 描述 LOWER char 将字符串表达式char中的所有大写字母转换为小写字母 UPPER char 将字符串表达式char中的所有小写字母转换为大写字母 INITCAP char 首字母转换成大写 SUBSTR ch
  • 模板方法模式与策略模式的区别

    原文 http www tuicool com articles 6JBN7z3 如果你还不了解模板方法模式和策略模式 请先阅读 策略模式 strategy 和 模板方法模式 模板方法模式的主要思想 定义一个算法流程 将一些特定步骤的具体实
  • 安利一个快速后台开发框架(ruoyi)

    http www ruoyi vip
  • 19年11月最新Win10 LTSC系统封装部署教程(超详细)

    写在前面 在本着认真负责 不交差 不敷衍的情况下 尽可能详细的描述整个过程 本文的经验方法大多数来自于网上朋友们的无私分享 在实际操作中遇到的坑我会在下文中进行标注 有任何意见或疑问欢迎留言讨论 感谢平台提供一个舒适的交流环境 v 0 15
  • (差分)曼彻斯特编码及NRZ

    曼彻斯特编码 Manchester Encoding 也叫做相位 编码 Phase Encode 简写PE 是一个同步时钟编码技术 被 物理层使用来编码一个同步位流的时钟和数据 它在 以太网媒介系统中的应用属于数据通信中的两种位同步方法里的
  • 【const】与指针、数组、结构体的使用

    目录 指针与数组 指针与const const const的作用 const int 与 int const const的错误使用 const char arr和char arr 10 的区别 结构体与const 指针与数组 指针可访问数组
  • vue3.0 PC端自适应不同分辨率电脑

    使用rem单位去做页面的适配 先来了解一下什么是rem rem是CSS3新增的一个相对单位 root em 根em 我们可以通过去设定X rem Y px x和y为自定义数值 如图设定1rem 10px 第一步 安装相应的依赖为我们自动将全
  • Masked Autoencoders Are Scalable Vision Learners(屏蔽自编码器是可扩展的视觉学习器)--文献翻译和笔记

    论文链接 2111 06377 Masked Autoencoders Are Scalable Vision Learners arxiv org 论文标题 Masked Autoencoders Are Scalable Vision
  • Entity Framework中使用SQLite的一些问题

    SQLite数据相当的不错 我目前在一些小型网站都用这个数据库来取代Access 下面就是关于在ASP NET的Entity Framework当中使用SQLite的一些经验和一些小问题的解决办法 想要在ASP NET中使用SQLite 首
  • js md5 解密_JS逆向小结(开始)

    最近想研究一下JS逆向的相关知识 先分享一篇大佬的小总结 明天正式开搞 1 我的逆向分析流程 对于js逆向来说 基本遵循一个简单的流程 我是先进行刷新网页进行抓包 找到自己的目标请求 大部分时候是一个 但是有时回事多个 先前返回的数据可能在
  • 【Linux】Linux常用快捷键

    前言 由于需要 梳理了一下常用的快捷键 以便忘记时查找 Linux系统快捷键 Bash解释器 1 Tab键 补齐命令 补齐路径 显示当前目录下的所有目录 2 清屏 clear Ctrl L L 大小写均可 3 中断 暂停进程 ctrl c
  • bmFont的使用方法

    1 打开 bmfont exe 2 字体设置 选择 Font settings 在这里我们选择微软雅黑 微软雅黑支持中文 字符编码 选择 Unicode 你还可以在 Font settings 对话框里进行字体大小 字体平滑程度等设置 3
  • Qt开发教程:实现全屏显示

    Qt开发教程 实现全屏显示 在Qt开发中 有时候需要让程序窗口全屏显示 以提升用户体验 本教程将介绍如何使用Qt实现全屏显示 设置窗口属性 在Qt中 我们可以通过设置窗口属性来控制窗口显示方式 在此之前 我们需要在 pro文件中添加以下代码
  • IDEA中用java建库、建表、插入、打印的方法

    数据库 mysql 连接方式 jdbc 文件组织结构 create db java package jdbc import java sql public class create db 建立数据库连接 并创建一个新数据库 按照传入的参数
  • Sourcetree连接远程仓库需要登陆,但是一直登陆不上的问题解决方法

    授权类型选用 基础 只需要登陆你用户名和密码 将https作为首选协议 连接成功后可改ssh
  • 机器学习大作业---文献综述

    机器学习大作业 文献综述 机器学习技术在材料化学预测方面最新应用综述 怎么写综述 摘抄自https www zhihu com question 303494762 answer 555476024 文献综述和综述论文是有区别的 文献综述可
  • 飞天平台安全相关

    飞天平台安全相关 1 capability机制 用户的身份认证 authentication 是基于密钥机制的 用户对资源的访问控制是基于权能 capability 机制进行授权 authorization 的 capability是用于访

随机推荐