二进制数的补码及运算

2023-10-31

本人研究不深,如有错误请不吝赐教!!

先来个最基本的介绍

参考:
https://blog.csdn.net/jdq8576/article/details/82425265
百度百科:https://baike.baidu.com/item/补码

源码&&反码&&补码&&二进制十进制小数部分的转化
在这里插入图片描述
一个正整数,当用原码,反码,补码表示时,符号位都固定为1,用二进制表示的数位值都相同,即三种表示方法都一样。一个负数,当用原码,反码,补码表示时,符号位都固定为1,用二进制表示的数位都不相同。此时由原码表示法变成补码表示法规则如下原码符号位1不变,整数的每一位二进制数位求反得到反码反码符号位为1不变,反码数值位最低位加1,得到补码。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


1.正数的补码表示
正数的补码 = 原码

负数的补码 = {原码符号位不变} + {数值位按位取反后+1} or

 = {原码符号位不变} + {数值位从右边数第一个1及其右边的0保持不变,左边安位取反}

以十进制整数+97和-97为例:

+97原码 = 0110_0001b

+97补码 = 0110_0001b

-97原码 = 1110_0001b

-97补码 = 1001_1111b

2.纯小数的原码
纯小数的原码如何得到呢?方法有很多,在这里提供一种较为便于笔算的方法。

以0.64为例,通过查阅可知其原码为0.1010_0011_1101_0111b。
操作方法:

将0.64 * 2^n 得到X,其中n为预保留的小数点后位数(即认为n为小数之后的小数不重要),X为乘法结果的整数部分。

此处将n取16,得

X = 41943d = 1010_0011_1101_0111b

即0.64的二进制表示在左移了16位后为1010_0011_1101_0111b,因此可以认为0.64d = 0.1010_0011_1101_0111b 与查询结果一致。

再实验n取12,得

X = 2621d = 1010_0011_1101b 即 0.64d = 0.1010_0011_1101b,在忽略12位小数之后的位数情况下,计算结果相同。

3.纯小数的补码
纯小数的补码遵循的规则是:在得到小数的源码后,小数点前1位表示符号,从最低(右)位起,找到第一个“1”照写,之后“见1写0,见0写1”。

以-0.64为例,其原码为1.1010_0011_1101_0111b

则补码为:1.0101_1100_0010_1001b

当然在硬件语言如verilog中二进制表示时不可能带有小数点(事实上不知道哪里可以带小数点)。

4.一般带小数的补码
一般来说这种情况下先转为整数运算比较方便。小数的补码,一般在计算机中适当做浮点数处理的,如果非要想要求补码,那就只能当做定点数求补码了,也就是定点小数(在不支持浮点运算的硬件电路里)。

-97.64为例,经查询其原码为1110_0001.1010_0011_1101_0111b

笔算过程:

-97.64 * 2^16 = -6398935 = 1110_0001_1010_0011_1101_0111b,其中小数点在右数第16位,与查询结果一致。

则其补码为1001_1110_0101_1100_0010_1001b,在此采用 负数的补码 = {原码符号位不变} + {数值位按位取反后+1} 方法

5.补码得到原码
方法:符号位不动,幅度值取反+1 or符号位不动,幅度值-1取反

-97.64补码 = 1001_1110(.)0101_1100_0010_1001b

取反 = 1110_0001(.)1010_0011_1101_0110b

+1 = 1110_0001(.)1010_0011_1101_0111b 与查询结果一致

6.补码的拓展
在运算时必要时要对二进制补码进行数位拓展,此时应将符号位向前拓展。

-5补码 = 4’b1011 = 6’b11_1011

ps.原码的拓展是将符号位提到最前面,然后在拓展位上部0.

-5原码 = 4‘b’1101 = 6’b10_0101,对其求补码得6’b11_1011,与上文一致。


补码求真值

已知一个数的补码,求真值: 如果是负数的话,先将该补码数值部分按位取反再加1,求出这个二进制代表的十进制数,然后加个负号就行了,如果是正数的话,这个二进制数代表的十进制就是真值。
例如:100 的真值: 00----->11 11+01=100 所以真值为-4
这个例子比较特殊,这个负数的补码与原码(真值)一样。。

所以说,补码到真值转换有两种转换方法,它的解释可以有有时钟来解释。


最后来谈谈小数/纯小数的补码问题。

求纯小数的原码、反码、补码

注意这里是纯小数,也就是-1到+1之间的小数,对于定点数表征的话,位宽全部用来存放小数位。。

在这里插入图片描述


了解规则后再细看。

【补码表示】为什么定点小数的-1补码表示为1.0000以及补码表示范围问题

首先了解一下原码,反码,补码的概念

原码

原码的表示方法:
在这里插入图片描述

在这里插入图片描述
简单来说就是,在机器中我们使用0和1来区分一个数的符号,用0来表示正数,用1来表示负数。而原码表示就是将一个数绝对值的二进制表示出来后根据是正数还是负数在前面加0或1表示数的符号。这里注意一点,在定点小数中,原码是不能表示出-1这个值的

反码

反码的表示方法

在这里插入图片描述
简单易懂一些的话其实就是如果是正数,X的反码就等于原码,如果是负数,将X的数值位全部取反

补码

在这里插入图片描述

在这里插入图片描述

对求一个数的补码有一个简单的口诀,若X是正数,则X的补码等于原码,若X是负数,X的补码就是在求出原码的基础上数值位全部取反后在最后一位加1。

机器数表示范围

https://blog.csdn.net/m0_37454852/article/details/78076027

以n位机器码为例。

  1. 原码:
      有符号整数:[-(2^n-1), 2^n-1];
      有符号小数:[-(1-2^(-n)), 1-2^(-n)];
  2. 反码的表示范围和原码相同
  3. 补码
      有符号整数:[-2^n, 2^n-1];
      有符号小数:[-1, 1-2^(-n)];

从上我们可以看出,有符号数的补码要比原码和反码多表示出一位来,那么究竟是为什么呢?

补码比原码、反码多出一位的原因:
  以8位机器码表示的有符号整数为例,它可以表示的原码和反码范围是[-127, 127],而可以表示的补码范围是[-128, 127]。
  原码和反码的±0是不同的表示方法,即:
    +0:00000000
    -0 :10000000
  而反码的±0都是同一个表示方法,同样以8位机器码为例:
    ±0 :00000000
  因此补码中便多出了一个<10000000>,可以用来表示其他的数,此处即可以表示真值为-128。在最位的1,既表示负号、又表示数值位。


https://blog.csdn.net/qq_39690706/article/details/85856792
根据上面的定义可以知道,原码和反码对于0有两种表示方法
原码中
[+0] = 0.0000,[-0] = 1.0000
反码中
[+0] = 0.0000,[-0] = 1.1111
补码中
[+0]=[-0]=0.0000
这里可以知道,在表示数据的时候,补码比原码少了一个-0,而由于表示数据所用的位数是一样的,也就是能表示的整数的个数不会变,所以补码会比原码和补码多表示一个数

对于定点整数

设位数一共为8位
原码表示范围为 -127-127,即1111 1111~0111 1111
反码表示范围为 -127-127,即1000 0000~0111 1111
补码表示范围为 -128-127,即1000 0000~0111 1111
我们可以尝试求一下-128的原码,但可以发现7位二进制表示不出来,必须得用8位二进制表示,但这样符号位就被占用了。但由于上面说的补码比原码和补码少一个0的表示方法,这就让补码多了一个10000000来表示其他的数,这里具体的细节我也不是很懂@_@,但可以这样记吧,-1到-127已经有对应的原码和补码了,所以也会有对应的补码,而10000000首位是1代表负数,不能和其他数的表示起冲突所以就是-128了。由此,补码可以表示128个负数,1个0以及127个负数共256个数

对于定点小数

还是设位数一共8位
原码表示范围为1.111 1111 ~0.111 1111,即-127/128到127/128
反码表示范围为1.000 0000~0.111 1111,即-127/128到127/128
补码表示范围为1.000 0000~0.111 1111,即-1到127/128
在这里原码和反码都好理解,就是补码会有一个问题,为什么补码会有一个1.000 0000而且居然对应的值是-1,也就是说如果小数用补码表示的话最小值是-1。这里如果用一开始说的取反加一你会发现根本不是这个值。之后才知道取反加一靠的是原码,但看前面原码的定义公式你会发现原码根本表示不了定点小数-1,原码所能表示的是定点整数-1,定点小数-1这里严谨一点的话其实是-1.0。
这里要求定点小数-1.0的补码的话就要用到上面的补码定义公式了(要不然我怎么会贴hhh),由公式可知,-1.0的补码为2+X = 2-1.0 = 1.000 0000
当然也有这样的理解
在这里插入图片描述

总结:由于补码表示0的唯一性,补码比原码少一个-0的表示,多一个-1的表示以及负整数表示范围多了一个-128
PS:主要是把自己最近碰到的问题写一下让自己记牢一些。其实如果把上面贴的几个公式吃透的话这些问题根本不会有的orz,注意对比原码反码补码边界的取值你会发现其实说的就是这些东西orz

参考:
http://bbs.kaoyan.com/t2806127p1


当然这里也有两个论坛,发现老是那些人在问,以及在回答这些问题。。

论坛1:

https://ask.csdn.net/questions/211705

正负小数的补码怎样求
正负小数的补码怎样求?
和整数的规律一样吗,也是正小数不变负小数求反加一么
求举例

网友1:

那看定点数还是浮点数,
浮点数是用阶码,尾数等表示的,和补码没什么关系。
定点数只能表示纯小数,也就是0.xxx这样的数,它的补码是把小数部分xxx取补就好了(就是整数不变,负数取反加一),当然带上符号位。

网友2:
纯小数补码

若真值为纯小数,它的补码形式为,Xs.X1X2X3X4X5Xn,其中Xs表示符号位,补码的定义为:【X】补=X(0<=X<1)或2+X=2-/X/(-1<=X<0)(MOD=2)
纯小数在求它的原码、反码、和补码时方法和整数是一样的。
例如:X=-0.1011 系统要是规定为8位,那么它的原码为
[x]原=1.1011000 [x]反=1.0100111 [x]补=1.0101000
也就是说系统规定为8位,当位数不够的时候,要在最低有效数后面用0补齐,然后再求它的原码、反码、和补码。正小数也是按照这个方法。

论坛2:

https://bbs.csdn.net/topics/390379095

在定点小数中,为什么-1的补码为:1.0000?
网友1:
定点小数中没有-1,只有-1.0

网友2:

二进制小数 原码对应十进制值 补码对应十进制值
0.00        0                0
0.01        0.25             0.25
0.10        0.5              0.5
0.11        0.75             0.75
1.00        1               -1
1.01        1.25            -0.75
1.10        1.5             -0.5
1.11        1.75            -0.25

网友3:
大神,你这里的二进制小数,最高位是符号位吗?如果是,
1.00(B) == -1(D)怎么算的?

最高位是符号位,0表示正数,1表示负数
求某个补码表示的负数对应的绝对值的步骤为:
各位取反,末位加1
1.00→各位取反→0.11→末位加1→1.00

想要了解更多,可以参见我另外一篇博客:
https://blog.csdn.net/edward_zcl/article/details/89439128
以及:
https://blog.csdn.net/AaricYang/article/details/87882868
https://blog.csdn.net/ferrarild/article/details/7050781

本文参考自:
https://blog.csdn.net/qq_39690706/article/details/85856792
https://blog.csdn.net/Anliya/article/details/5345741
https://blog.csdn.net/jdq8576/article/details/82425265
https://blog.csdn.net/qq_40816078/article/details/82689492
https://blog.csdn.net/moon9999/article/details/57130068

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

二进制数的补码及运算 的相关文章

  • 计算机基础知识

    一 操作系统的作用 xff1a 1 xff1a 管理底层硬件设备 2 xff1a 整合资源 xff0c 提供给上层软件使用 二 硬件资源分类 1 xff1a 计算资源 2 xff1a 存储资源 xff1a 硬盘 U盘 光驱 3 xff1a
  • 自我理解:类模板和模板类、函数模板和模板函数

    一 类模板和模板类 1 类模板 类模板的重点是模板 表示一个专门用来产生类的模板 类模板是对一批仅仅成员数据类型不同的类的抽象 只要为这一批类创建一个类模板 给出一套程序代码 就可以用来生成多种具体的类 模板类 从而大大提高编程的效率 te
  • 超详细进制转换(二进制、八进制、十进制、十六进制)详解

    目录 在学习四种进制转换之前先了解一下自种进制的特点 一 整数转换 1 十进制转R进制 2 R进制转十进制 3 二进制转八进制 十六进制 4 八进制转二进制 二 小数转换 1 十进制转R进制 2 R进制转十进制 在学习四种进制转换之前先了解
  • 网络安全:XSS、CSRF、点击劫持、HTTPS加密(中间人攻击、DNS劫持)、泛洪攻击、SQL注入

    一 XSS攻击 什么是 XSS 攻击 XSS 全称是 Cross Site Scripting 即跨站脚本 为了和 CSS 区分 故叫它XSS XSS 攻击是指浏览器中执行恶意脚本 无论是跨域还是同域 从而拿到用户的信息并进行操作 这些操作
  • 自我理解:封装、继承和多态

    一 封装 1 概念 封装就是隐藏对象的属性和实现细节 只对外公开一些操作内部属性的方法 接口 函数 2 目的 增强安全性 简化编程 使用者不必了解具体的实现细节 只需要通过外部接口 就可以对类的内部成员进行操作 class A public
  • 计算机考研复试常问问题 数据结构篇

    第一章 绪论 1 时间复杂度 时间复杂度 算法执行时所需要的计算工作量 与整个算法的执行时间和基本操作重复的次数成正比 一个语句的频度是指该语句在算法中被重复执行的次数 算法中所有语句的频度之和记为T n O T n 的数量级 数量级 数量
  • 内存碎片是什么?关于内存碎片的解释

    内存碎片是什么 关于内存碎片 内存碎片通常分为内部碎片和外部碎片 内部碎片 所谓内部碎片指的就是 系统为某项功能分派了一定的内存 但是该功能的实现没有用完所有系统分配的 余下的部分就被成为内存碎片的内部碎片 外部碎片 外部内存指的是有一些连
  • cpu 最佳线程数和QPS以及RT

    最近在关注性能的事情 所以对于多线程程序中 如何设置最佳的线程数 找了一些文章 虽然有公式可以套用 但是 其实最佳的话只是相对的 了解了过程之后 处理线程数的设置就会游刃有余了 名字解释 1 QPS 系统每秒处理的请求数 query per
  • 软件测试_笔记(完整版)

    软件测试 概述 程序 文档 数据 软件 狭义的软件测试定义 为发现软件缺陷而执行程序或系统的过程 广义的软件测试定义 人工或自动地运行或测定某系统的过程 目的在于检验它是否满足规定的需求或弄清预期结果和实际结果间的差别 为什么要做软件测试
  • Conda 常用指令 (Mac)【下载 安装 环境配置 查看 创建 激活 配置cuda 拷贝环境】

    本文旨在介绍用conda配置一个新的深度学习环境的全过程 下载Anaconda 在 官网 中下载与python版本匹配的Anaconda Python与Anaconda版本匹配如下 图片源自 该博客 在本例中我下载的 Anaconda3 2
  • 对称加密和非对称加密

    对称加密 什么是对称加密 对称加密就是指 加密和解密使用同一个密钥的加密方式 对称加密的工作过程 发送方使用密钥将明文数据加密成密文 然后发送出去 接收方收到密文后 使用同一个密钥将密文解密成明文读取 对称加密的优点 加密计算量小 速度块
  • 高速缓存(cache)的原理: 了解计算机架构与性能优化

    计基之存储器层次结构 Author Once Day Date 2023年5月9日 长路漫漫 而今才刚刚启程 本内容收集整理于 深入理解计算机系统 一书 参看文档 捋一捋Cache 知乎 zhihu com iCache和dCache一致性
  • LaTex 加粗(加黑)的方式

    1 基本 LaTeX技巧458 关于LaTeX数学字体加粗 mathbf 会变为粗体 但也导致数学字母斜体形式的丢失 使用 amsmath package 的 boldmath 命令 boldmath f x y 3 x y y 2xy 7
  • 计算机考研复试常问问题 计算机网络篇

    一 计算机网络体系结构 1 OSI TCP IP和五层体系结构 五层协议 分为5层 自上到下分别为 应用层 传输层 网络层 数据链路层 物理层 应用层 为特定应用程序提供数据传输服务 传输单位是报文 传输层 为不同主机的进程提供通信服务 传
  • 补码的作用

    补码的作用 避免零在二进制中的歧义 另一个好处就是方便运算 所有运算都能用加法运算器来实现 不再需要减法运算器 其实在计算机中 所有的减法操作都被转化为加法操作 如果想要深入研究 可以看看计算机组成原理 举个简单的例子 正数的补码和反码 原
  • 【MacOS】SSH 设置别名+免密登录

    设置别名 首先 进入ssh的config文件 vim ssh config 按I写入 Host my name User zmq HostName 1xx xx xx xxx Port 22 输入 x保存退出 设置别名成功 可以直接 ssh
  • 什么是域名? 什么是DNS?

    域名 关于域名 百度百科是这样介绍的 百度百科 https baike baidu com item E5 9F 9F E5 90 8D 86062 域名 英语 Domain Name 又称网域 是由一串用点分隔的名字组成的Internet
  • 计算机原码,反码,补码,以及之间的转换 ,计算机底层为什么要用二进制反码和二进制补码

    1 为什么要使用二进制 首先我们需要知道 计算机底层的存储方式 所有数字在计算机底层都以二进制形式存在 二进制数据的存储方式 所有的数值 不管正负 底层都以补码的方式存储 二进制是机器语言 由于计算机并不能像人一样计算与思考 而使用二进制
  • 计算机中的换行符、回车符、\n、\r、\n\r 怎么区分

    n是换行 英文是New line r是回车 英文是Carriage return r 是回车 前者使光标到行首 carriage return n 是换行 后者使光标下移一行 line feed r 是回车 return n 是换行 new
  • 阿兰·麦席森·图灵 介绍

    Alan MAthison Turing 英国数学家 逻辑学家 被称为 计算机科学之父 人工智能之父 她曾协助盟军破解德国的著名密码系统Enigma 帮助盟军取得了第二次世界大战的胜利 他对计算机的贡献在于他提出的有限状态自动机也就是图灵机

随机推荐

  • 关于保护继电器触点(灭弧)

    我用继电器驱动一个24V 60w电机 采用0 33uF 400V电容并联在触点上作为吸收和保护电容 用不了多久 就被击穿了 现在用的电容是0 1uF的X2电容 这种电容标称耐压是 275V 实际能承受2500V的冲击电压 后来的仿真和示波器
  • Prometheus-05 Prometheus的核心概念和架构

    Prometheus是一个开源的监控系统和时间序列数据库 被广泛应用于云原生环境中的监控和告警 本文将介绍Prometheus的核心概念和架构 帮助读者了解Prometheus的工作原理和基本组件 1 核心概念 Prometheus基于一些
  • python配置文件解析_【Python】configparser - 配置文件解析

    目录 一 介绍 ConfigParse 类实现一个基本配置文件解析器语言 提供了一个类似于Microsoft Windows INI 文件的结构 可以使用它来编写可由最终用户轻松定制的Python程序 注意 这个库不支持能够解析或写入在 W
  • java: 详解java中的集合框架

    一 Java集合框架概述 1 图解 集合可以看作是一种容器 用来存储对象信息 所有集合类都位于java util包下 但支持多线程的集合类位于java util concurrent包下 上图中淡绿色背景覆盖的是集合体系中常用的实现类 分别
  • GitHub项目管理详细教程/git教程【有图有代码】

    GitHub项目管理详细教程 git教程 有图有代码 一 Git 基本操作 二 Git 配置 1 配置个人的用户名称和电子邮件地址 2 查看配置信息 三 Git 工作区 暂存区和版本库 四 上传自己的项目到GitHub仓库 第一次 第二次
  • Python:Flask简单实现统计网站访问量

    hello 我是wangzirui32 今天我们来学习如何使用Flask简单实现统计网站访问量 开始学习吧 学习目录 1 项目架构 2 项目文件编写 2 1 index html 主页编写 2 2 people json 数据初始化 2 3
  • 为什么是 Dart ?

    为什么是 Dart 为什么选择Dart语言 这是很多人的疑问 让我们先来看看 最近Dart 编程语言的发展情况 2022年2月TIOBE编程语言排行榜 很遗憾 Dart在前20名之外 但好消息是它还处于前30名之内 在这个排行榜中 值得我们
  • 修复微信小程序获取头像的bug,微信小程序新版头像API使用

    接着我之前发布的一篇文章 微信小程序上传头像的临时路径 持久化保存到服务器与数据库 nodejs后台开发 盒子猫君的博客 CSDN博客 今天我就来解决掉之前的问题吧 从之前的后台报错来看 获取到的tempFilePath值和avatarUr
  • umi配合proLayout , 菜单与面包屑设置问题( 通过路由生成菜单)

    问题 本项目为umi配合 prolayout 设置路由自动生成菜单 出现问题为 有些二级三级路由 需要在导航路由显示 但在菜单栏不显示 一 配置proLayout生成菜单 ProLayout 与 umi 配合使用会有最好的效果 umi 会把
  • js获取cookie对象

    function getCookie sName 获取cookie对象 并按 进行分割 let aCookie document cookie split 遍历数组根据 遍历出来的每一个元素进行分割因为cookie中的存储形式 是这样的 u
  • 图像拼接(融合)算法—matlab代码

    寻找两图像色差差异最小处进行左右拼接 拼接 融合 clc clear close all img1 imread 试验图 1 bmp 左图 img2 imread 试验图 2 bmp 右图 figure imshow img1 显示 fig
  • 批次属性创建BAPI在S/4一些变化

    批次属性变更同样是使用的以下三个BAPI VB BATCH 2 CLASS OBJECT 获取物料批次信息 BAPI OBJCL GETDETAIL 获取批次对象属性 BAPI OBJCL CHANGE 修改批次对象属性 在传统的ECC系统
  • 复习前端知识(HTML)

    前言 前端学习学了忘 忘了学 知识点学的一地稀碎 最近准备对现在掌握的知识点进行梳理并整理 用于帮助自己记忆 如果有什么地方写的有错误或者有遗漏的地方 欢迎大家指正 一 HTML文档基本结构 HTML文档基本结构主要包含以下几个标签 用于声
  • 树莓派体验13 - 树莓派3B板载wifi配置方法

    树莓派3代B版自带板载wifi和蓝牙 因此想让树莓派通过wifi上网不再需要单独购买wifi模块 通过简单配置板载wifi即可快速实现 配置方法在命令行操作 前提是你需要进入命令行终端 进入命令行终端的方法有多种 串口 SSH HDMI 显
  • 正点原子IMX6ULL阿尔法USB摄像头的远程调用(四)Python的实现

    话不多说 先上界面 前情提示 做这个例子 需要USB摄像头已经调好了 同时电脑上已经安好了python pyqt5 opencv等 下面演出开始吧 直接上代码 源代码直接上 coding utf 8 Form implementation
  • [QT_012]Qt学习之QTreeWidget 详解

    本文转自 Qt编程指南 作者 奇先生 Qt编程指南 Qt新手教程 Qt Programming Guide 树形控件的节点可以有多层 多个子节点 如果将子节点全部展开 那么每一行都是一个数据条目 QTreeWidgetItem 比较特殊 一
  • python mypy类型检查_Python 类型检查指南

    Python 作为一种动态语言 在 PEP484 3 5 才支持 Type Hints 且类型申明是 optional 的 对于从静态语言 比如 Java 国内大学专业cs or se的教学语言也是以 C C Java 为主 转过来的人来讲
  • sort算法流程

    通过卷积神经网络得到detection以后做一个IoU的匹配 这个匹配是和当前的tracks做匹配 detection的数目和tracks的数目并不一定相等 匹配是通过匈牙利算法进行求解 结果就有 Unmatched Tracks 未匹配上
  • XGB原理总结记录

    1 CART树 Classification And Regression Tree CART 是决策树的一种 并且是非常重要的决策树 属于Top Ten Machine Learning Algorithm 顾名思义 CART算法既可以用
  • 二进制数的补码及运算

    本人研究不深 如有错误请不吝赐教 先来个最基本的介绍 参考 https blog csdn net jdq8576 article details 82425265 百度百科 https baike baidu com item 补码 源码