Java——二进制原码、反码和补码

一、简要介绍

原码、反码和补码只是三种二进制不同的表示形式,每个二进制数都有这三个形式。

1、原码

原码是将一个数的符号位和数值位分别表示的方法。

最高位为符号位,0表示正,1表示负,其余位表示数值的绝对值。

例如:

原码0000 0001        (1)D

原码1000 0001        (-1)D

2、反码(Ones' Complement)

反码是通过对二进制数逐位取反(0变1,1变0)得到的表示方法。正数的反码同其原码相同;负数的反码是其原码数值位逐位取反,符号位不变。

正数的反码同其原码相同,负数的反码是其原码数值位逐位取反,符号位不变。

正数

原码0000 0001        (1)D

反码0000 0001       (1)D

负数转反码,将数字位按位取反(原来为0变为1,原来为1变为0),符号位不变

负数

原码1000 0001        (-1)D

反码1111 1110        (-1)D

3、补码(Twos' Complement)

补码是通过对反码加1得到的表示方法。补码广泛用于计算机系统中,因为它简化了加减法运算。

正数的补码与反码一致,也与原码一致

也就是说正数的原码、反码和补码都是一样的。

正数

原码0000 0001        (1)D

补码0000 0001        (1)D

负数反码转补码,加一就可以得到补码

负数

反码1111 1110        (-1)D

补码1111 1111        (-1)D

负数原码转补码,将数字位按位取反后再加1,即将其反码加1

负数

原码1000 0001        (-1)D

补码1111 1111        (-1)D

补充:

1)计算机中二进制数据都是以补码形式存储

在计算机中的内存中,数据都是以二进制补码的形式存储的进行计算也是使用补码。这是因为补码的形式便于运算:

cpu只有加法器,没有减法器,所以计算机计算减法时,是把减法转化为加法。

例如要计算5 - 5,要转化为5 + (-5)来计算

1)用源码计算:0000 0101 + 1000 0101 = 10001010 = -10(D)        (结果不对)

2)用反码计算:0000 0101 + 1111 1010 = 1111 1111

1111 1111为反码,转换成原码为1000 0000 ,1000 0000 = -0,结果是对的,

但是这样0就有了两种表达方式:1000 0000    (-0)D    和    0000 0000    (+0)D

对于原码 0000 0000 的反码就是 0111 1111 ,这样减少了可表示数字的数量

3)用补码计算:0000 0101 + 1111 1011 = 1 0000 0000(超出第八位。高位溢出,即第九位的 1 舍去),最终结果为 0000 0000 ,得出结果为0,结果是正确。

而且补码形式 0 只有 0000 0000 这一种表达方式,相比反码增加了可表示数字的数量

2)二进制每一位占用 1bit 内存

0000 0101 为八位二进制数字,他的最低位为第零位,最高位为第七位,一共八位,占用 8bit 即 1 字节的内存。

计算机中存储二进制数据,每一位二进制数据占用 1bit 的空间。

就如 int 类型的数据,它占用 4 字节的内存空间,也就是 32bit 的空间,实际山它转换为二进制就是一个 32 位的二进制序列。

二进制系统只使用两个符号(0和1),与硬件电路的设计非常匹配。

3)一般我们要看一个二进制数的具体值时,要将其转换为原码

一般我们要看一个二进制数的具体值时,要将其转换为原码。因为只有原码形式对于人类是易读的。

补码补充:

我们上面的介绍中说道,从二进制原码转换为二进制补码需要两步,先将原码转换为反码,然后再将反码转换为补码,下面使用图像详细解释:

十进制负数 -10 的二进制原码为 10000000 00000000 00000000 00001010

下图为转换为补码的详细图解:

我们知道了从原码转换为补码的确切步骤后,就知道了从补码转换为原码的确切步骤,就是原码转补码的步骤反过来。就像上面的例子,如果我们知道了十进制数字 -10 的补码 11111111 11111111 11111111 11110110 就可已通过下面的方式转换为原码:

但是实际上,补码转换为原码不止这一种方法,还可以使用将补码数值位取反加一的方法将补码转换为原码

这个步骤与原码转换为补码的步骤是一样的,也就是说:补码的补码是原码。

对于上面,我们谈到计算机使用补码作为二进制数据的存储方式的原因,实际上还有这里的一个原因,因为原码转换为补码和补码转换为原码的步骤可以是一样的,不需要额外的计算需求。

二、快速原码互相转换方法

给一个十进制数字 -28,它的原码是1001 1100

负数

原码1001 1100        (-28)D

补码1110 0100        (-28)D

快速将负数原码转化为补码的方法

从右向左转换,第一个1之前的0都不变,还写为0,第一个1也不变,还写为1,第一个1后面的1和0都变为相反的数,即0变1,1变0,最后一位(最高位/符号位)不变

快速将负数补码转换为原码的方法

从左向右转换,第一位(最高位/符号位)不变,最后一个1之前的1和0都变为相反的数,即0变1,1变0,最后一个1不变,还写为1,最后一个1之后的0也不变,还写为0

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

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

相关文章

生成式AI,在云端的绽放与盛开

编辑:阿冒 设计:沐由 毫无疑问,生成式AI已然成为当今技术发展和应用创新的重要引擎之一。 过去的一年多时间里,我们每个人都在目睹和见证着生成式AI是如何以移山倒海的力量,为诸多行业带来革命性乃至颠覆性的变革&…

FS118M 单A口QC协议芯片

FS118M是一个QC快充协议芯片,FS118M可以识别插入的手机类型,选择最为合适的协议应对手机需要。USB Type-A 口的 D连接到FS118M芯片,当手机插入到 USB Type-A 口后,根据各个协议的约定,手机和FS118M之间将开始互相识别&…

计网ppt标黄知识点整理第(2)章节——谢希仁版本、期末复习自用

物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输数据比特流,而不是指具体的传输媒体。4 个特性: 机械特性:指明接口所用接线器的形状和尺寸、引线数目和排列、固定和锁定装置等。 电气特性:指明在接口电缆的各条线上出现…

C/C++开发,2024.x CLion安装,亲测有效

CLion 是一款专为 C 和 C 开发者设计的跨平台集成开发环境(IDE),提供了智能代码补全、代码分析、调试和 Git 集成等功能,以提高开发效率和代码质量。 1.下载安装c/c开发工具 CLion 先去官网下载,我这里下载的是最新版…

【docker】docker的安装

如果之前安装了旧版本的docker我们需要进行卸载: 卸载之前的旧版本 卸载 # 卸载旧版本 sudo apt-get remove docker docker-engine docker.io containerd runc # 卸载历史版本 apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker…

问答机器人

怎样做自己的问答机器人? 根据我们提供的数据分析出问题的答案,我们并不需要训练自己的模型 微调模型 finetune,将语言模型调成另外的语言模型,更适合不同类型数据,运用finetune方法将模型变化 知识库模型 embedd…

word避免画质画质模糊方法

问题描述:   近期写文档时会高频率贴图,粘图过程中发现Word会自动压缩图片画质,而且压缩得很严重,下面是一幅图被压缩前后的画质对比 (图片压缩前) (图片压缩后) 解决方案&#x…

修改文档日期神器 - Python打造日期修改器

这篇文章将介绍一款使用 Python 开发的实用工具 - 日期修改器。它可以帮助您轻松修改 Word (.docx) 和 PDF 文档的日期信息,满足日常办公和文档整理的需求。 C:\pythoncode\new\modifyfiledate.py 软件功能 支持修改 Word (.docx) 日期信息。允许选择要修改的日期…

leetcode146.LRU缓存,从算法题引入,全面学习LRU和链表哈希表知识

leetcode146. LRU 缓存 题目链接 请你设计并实现一个满足 LRU (最近最少使用) 缓存约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中,则返回关…

三种字符串的管理方式

NSString的三种实现方式 OC这个语言在不停的升级自己的内存管理,尽量的让自己的 OC的字符串 问题引入 在学习字符串的过程中间会遇到一个因为OC语言更新造成的问题 例如: int main(int argc, const char * argv[]) {autoreleasepool {NSString* str1 …

ZCU102启动镜像(详细版)

ZCU102启动镜像--详细版本 详细步骤1、安装好Vitis(GUI界面)、 Vivado、 Petalinux软件然后vivado这边的操作就先结束了 创建Petalinux工程编译镜像打包 详细步骤 B站参考视频链接: link 1、安装好Vitis(GUI界面)、 Vivado、 Pe…

SpringBoot:手动创建应用

Spring提供了在线的Spring Initialzr在线创建Spring Boot项目,为了更好的理解Spring Boot项目,这里我们选择手动创建。 1.新建Web应用 1.1 生成工程 首先要做是创建一个Java项目,这里我们选择使用Maven来支持,使用archetype:ge…

C++进阶之AVL树+模拟实现

目录 目录 一、AVL树的基本概念 1.1 基本概念 二、AVL树的模拟实现 2.1 AVL树节点的定义 2.2 插入操作 2.3 旋转操作 2.4 具体实现 一、AVL树的基本概念 1.1 基本概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树&…

【论文速读】Self-Rag框架,《Self-Rag: Self-reflective Retrieval augmented Generation》

关于前面的文章阅读《When to Retrieve: Teaching LLMs to Utilize Information Retrieval Effectively》,有网友问与Self-Rag有什么区别。 所以,大概看了一下Self-Rag这篇论文。 两篇文章的方法确实非常像,Self-Rag相对更加复杂一些。 When …

图数据库Neo4j——Neo4j简介、数据结构 Docker版本的部署安装 Cypher语句的入门

前言 MySQL是一种开源的关系型数据库管理系统,使用SQL作为其查询语言,常见的关系型数据库有MySQL、Oracle、SQL Server、PostgreSQL等。相关博客文章如下: 【合集】MySQL的入门进阶强化——从 普通人 到 超级赛亚人 的 华丽转身PostgreSQL数…

计算机系统结构之流水

一、标量流水线的主要性能 吞吐率是流水线单位时间里能流出的任务数或结果数(最大吞吐率:单位时间内计算机所能处理的最多指令条数)。 流水线中经过时间最长的子过程成为瓶颈子过程。最大吞吐率取决于瓶颈段的时间。 实际吞吐率: 加速比: …

教你搞一个比较简单的计时和进度条装饰器 (多线程进阶版)

简单的计时和进度条装饰器 - 多线程进阶版 这个进阶版有什么?话不多说上代码效果图 上一篇关于装饰器的Blog 这个进阶版有什么? 在上一个装饰器工作时,跑了20秒后就停止了。如果运行的函数跑了60秒,后面的40秒我们是只能等到结束…

CAD二次开发(7)- 实现Ribbon选项卡,面板,功能按钮的添加

1. 创建工程 2. 需要引入的依赖 如图,去掉依赖复制到本地 3. 代码实现 RibbonTool.cs 实现添加Ribbon选项卡,添加面板,以及给面板添加下拉组合按钮。 using Autodesk.Windows; using System; using System.Collections.Generic; using S…

悬剑武器库5.04版

工具介绍 悬剑5 基于“悬剑网盘”精选工具集悬剑5“飞廉”云武器库制作。 操作系统:Windows 10 专业版 锁屏密码:secquan.org 解压密码: 圈子社区secquan.org 镜像大小:33.1GB 系统占用空间63.0 GB 镜像导入 下载镜像,文末…

WordPress博客主题触屏版社区源码

下载地址:WordPress博客主题触屏版社区源码