原码、补码、反码、移码是什么?

计算机很多术语翻译成中文之后,不知道是译者出于什么目的,往往将其翻译成一个很难懂的名词。

奇怪的数学定义

下面是关于原码的“吐槽”,可以当作扩展。你可以不看,直接去下一章,没有任何影响。
原码的吐槽放在前面是防止读者看完原码,然后看半天才看到补码,影响阅读体验。

某些书描述“原码”的时候很“奇怪”,你可能在某些书上见到过下面这样很难理解的描述(下图截自原码 - 维基百科):
请添加图片描述

这玩意是数论里的等价类,也就是计算机里常出现的“模运算”。或者还有个更高级的名字:散列(因为很多散列算法就是模运算,然后用的等价类的思想)。

等价类:3 mod 21 mod 2的结果都为1,所以都等于[1],也就是31都是1的等价类。

那上面的那一堆是什么意思呢?

以整数原码为例,X是一个数,范围不定。

[+1011]的意思是和+1011等价的所有数:
X m o d 2 n = 1011 X mod 2^n = 1011 Xmod2n=1011

比如 n > 4 n>4 n>4的时候 2 n > 0 b 1111 2^n>0b1111 2n>0b1111
1011 m o d 2 n = 1011 ( 2 n + 1011 ) m o d 2 n = 1011 1011 mod 2^n = 1011\\ (2^n + 1011) mod 2^n = 1011 1011mod2n=1011(2n+1011)mod2n=1011

[-1011]的意思是和(2^{n-1} - 1011)等价的所有类:

( 2 n − 1 − X ) m o d 2 n = 1011 (2^{n-1} - X) mod 2^n = 1011 (2n1X)mod2n=1011

比如是 8 位的数字:
( 2 8 − 1 − ( − 1011 ) ) m o d 2 n = ( 10000000 + 1011 ) ) m o d 11111111 = 10001011 (2^{8-1} - (-1011)) mod 2^n =\\ (10000000 + 1011)) mod 11111111 = 10001011 (281(1011))mod2n=(10000000+1011))mod11111111=10001011

这是教材,不是论文,而且一般论文也不用这么说吧?

这种表达方式唯一的好处就是让你理解溢出之后该怎么处理,因为取模运算的值就是溢出后得到的值。

说实话这种表达方式就不应该出现在任何现代教材中,哪怕是很多数学分析的书都不会这样描述数的。我不知道这种用法最早出现在哪里,但是欧美一些常见的计算机组成与设计教材中没有出现过这种用法,也就是说并不是盲目学来的。

不论是“true code”还是“true form”都在英文搜索中难以找到。WiKi “有符号数处理”中,“原码”对应的是“符号及值(sign & magnitude)”,英文版直接就是“Sign–magnitude”。这玩意的在一些教材中的翻译是“符号和幅值表达法”,看看这个名字多清晰和直白。

这个方法读者理解就好,没必要学,后文也完全不使用这个方法,怎么容易理解怎么来。但计算机科学确实有很多算法使用了等价类的概念,所以如果你要走算法方向,还是要看看的。

原码

原码就是我们常用的数,在计算机中就是用二进制表示的十进制数,不论正负、不论整数还是小数。

n位原码就是用最高位(小端就是最右位)当作符号位(0为正数,1为负数),关于0对称范围内的数( − 2 n ~ 2 n -2^n~2^n 2n2n),比如-4~4-16~16,范围的两个端点关于0对称,正负数的个数相同。

补码(2’s complement)

n位补码就是用最高位(小端就是最右位)当作符号位(0为正数,1为负数)关于0不对称范围内的数( − 2 n − 1 ~ ( 2 n − 1 − 1 ) -2^{n-1}~(2^{n-1}-1) 2n1(2n11)),比如-16~15,范围的两个端点关于0不对称。

这里概念很容易和和其他码搞混,比如原码。

但其实只用记住一个关键点:补码的-11111,而原码是1001

换言之,从零值的“生长”来说:

  • 原码相当于少一位(最大的那位)的无符号数。抛开符号位-xx的表达是一样的,所以上下限的绝对值是一样的。
  • 补码从0开始增减,0b0000-1,借位算出是0b1111。但是+1增的时候,要注意不能让最大位为1,所以上限比下限绝对值少1

补码是现在主流的格式,所以各种考试也主要考补码。

反码(1’s complement)

反码中,一个数的相反数就是按位取反,1001,这也是名字的由来。

比如1(00000001)按位取反,得到-1(11111110)。

所以反码和原码一样,是关于0对称的,所以正负数的个数相同。但是不同之处在于:反码有两个0,正0(0000)和负0(1111)。

在无符号数的反码中,x按位取反为 2 n − 1 − x 2^n-1-x 2n1x

因为无符号反码增长就是从0一直加,所以最大值是 2 n − 1 2^n-1 2n1。而按位取反就相当于从尾部往前倒。

你可以观察一下下面这个表格,再看看我的说法,你就会理解了。
请添加图片描述

反码(1’s complement)早期设备用的多,现在用补码(2’s complement)是主流,因为反码计算的时候更麻烦一些,只是在计算一些科学计算的时候更有优势罢了。

看开头的数字也可以看出顺序来(啊对,这两个英文中的数字就是版本,这你能想到哈哈哈哈)。

移码(Offset binary)

移码又称“偏移表示法”,这个方法现在是上面浮点数用的多,比如 IEEE 754。

移码从0000开始递增,依旧使用最高位位符号为,只不过这里1表示正数
0表示负数。与前面的几种方法相反。

有符号移码最小的负数是0000,最大的整数是111101000

这里可能好奇名字中“偏移”的意思,其实就是“给数加上一个偏移数后,使其具有非负的表达形式”。

比如上面的0,加上一个偏移1000,得到的就是1000,也就是0,非负。

关于这部分,浮点数中再细说吧。

希望能帮到有需要的人~

参考资料

《Computer Organization and Design MIPS Edition: The Hardware/Software Interface Fifth Edition》:如果你要学习计算机结构的话,这本书要比国内的很多教材好,但是翻译的确实不太行。

原码 - 维基百科

Signed number representations - 维基百科

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

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

相关文章

Java修仙之路,十万字吐血整理全网最完整Java学习笔记(进阶篇)

导航: 【Java笔记踩坑汇总】Java基础JavaWebSSMSpringBootSpringCloud瑞吉外卖/黑马旅游/谷粒商城/学成在线设计模式面试题汇总性能调优/架构设计源码-CSDN博客 推荐视频: 黑马程序员全套Java教程_哔哩哔哩 尚硅谷Java入门视频教程_哔哩哔哩 推荐书籍&am…

基础动态规划题目基础动态规划题目

目录 题目1: P1216 [USACO1.5] [IOI1994]数字三角形 Number Triangles 代码示例: 题目2: Common Subsequence 代码示例 题目3 :最长上升子序列 最长不下降子序列 最长上升子序列oj答案 题目1: P1216 [USACO1.5]…

ASP.NET Core中创建中间件的几种方式

前言 今天我们一起来盘点一下在ASP.NET Core应用程序中添加和创建中间件常见的四种方式。 中间件介绍 ASP.NET Core中间件(Middleware)是用于处理HTTP请求和响应的组件,它们被安排在请求处理管道中,并按顺序执行。中间件的设计是为…

15- 微分方程

对三角函数不敏感

快捷:通过胶水语言实现工作中测试流程并行、加速

通过胶水语言实现工作中测试流程并行、加速 通过胶水语言实现工作中测试流程并行、加速工作场景(背景)问题抽象(挑战)如何做(行动)获得了什么(结果)后记相关资源 通过胶水语言实现工…

十大排序 之 快速排序

!!!排序仅针对于数组哦本次排序是按照升序来的哦代码后边有图解哦 介绍 快速排序英文名为Quick Sort 基本思路 快速排序采用的是分治思想,即在一个无序的序列中选取一个任意的基准元素base,利用base将待排序的序列分…

【BUG】已解决:error: subprocess-exited-with-error

已解决:error: subprocess-exited-with-error 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,武汉城市开发者社区主…

Ubuntu上安装配置samba服务

Ubuntu上安装配置samba服务 在Ubuntu中安装配置samba共享服务,可以让你在网络上共享文件和打印机。以下是一个相对详细的步骤指南,介绍如何在Ubuntu上安装和配置Samba。 1. 安装Samba 首先,需要安装Samba软件包。打开终端并运行以下命令&a…

Python基础语法篇(上)

Python基础语法(上) 一、基知二、基本数据类型(一)标准数据类型(二)数据类型转换 三、字符串基本操作(一)字符串的索引和切片(二)字符串的拼接 三、运算符四、…

新一代大语言模型 GPT-5 对工作与生活的影响及应对策略

文章目录 📒一、引言 📒二、GPT-5 的发展背景 🚀(一)GPT-4 的表现与特点 🚀(二)GPT-5 的预期进步 📒三、GPT-5 对工作的影响 🚀(一&#xf…

STM32使用Wifi连接阿里云

目录 1 实现功能 2 器件 3 AT指令 4 阿里云配置 4.1 打开阿里云 4.2 创建产品 4.3 添加设备 5 STM32配置 5.1 基础参数 5.2 功能定义 6 STM32代码 本文主要是记述一下,如何使用阿里云物联网平台,创建一个简单的远程控制小灯示例。 完整工程&a…

元宇宙深入解析

元宇宙(Metaverse)是一个新兴的概念,它激发了技术专家、艺术家和商业领袖的无限想象。它代表着数字互动的新前沿,提供了一个平行的数字宇宙,用户可以在其中实时互动,超越物理世界的限制。 元宇宙是什么&am…

【java】力扣 合法分割的最小下标

文章目录 题目链接题目描述思路代码 题目链接 2780.合法分割的最小下标 题目描述 思路 这道题是摩尔算法的一种扩展 我们先可以找到候选人出来,然后去计算他在左右两边元素出现的次数,只有当他左边时,左边出现的次数2 >左边的长度&…

【C++】拷贝构造函数及析构函数

📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…

百分点科技签约潍坊市数据产业发展战略合作

近日,潍坊市数据产业发展战略合作签约仪式举行,潍坊市人民政府副市长张震生,潍坊市财政局党组书记、局长王金祥,潍坊市大数据局党组书记陈强出席大会并致辞。百分点科技受邀进行战略合作签约,共同见证潍坊市数据要素市…

力扣—长度最小的子数组

文章目录 题目解析解题思路代码实现 题目解析 给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回…

捷配笔记-HDI板与普通PCB板的区别

HDI是什么? HDI(High Density Interconnect) 全称高密度互连板,是一种线分布密度高的高密度电路板,在现代电子设备中扮演着至关重要的角色。 它具有轻薄、线路密度高、有利于先进构装技术的使用、电气特性与信号更佳、改善射频干扰/电磁波干扰/静电释放…

matlab PID tuner整定工具箱的用法

从主页的APP中搜索到它: 按照下图IMPORT导入被控对象的传递函数 在下图的Inspect按钮中可以看到导入的被控对象的传函。 在下图的Type中选择控制器类型: 在下图的Form中选择PID的形式:有两种可选:平行式Parallel和标准式Standard …

K8S 上部署 Emqx

文章目录 安装方式一:快速部署安装方式二:定制化部署1. 使用 Pod 直接部署 EMQX Broker2. 使用 Deoloyment 部署 Pod3. 使用 Services 公开 EMQX Broker Pod 服务4. 通过 kubernetes 自动集群 EMQX MQTT 服务器5. 修改 EMQX Broker 的配置6. 赋予 Pod 访…

阿里云短信PHP集成api类

无需安装sdk扩展包&#xff0c;直接引入类即可使用 V3版本请求体&签名机制:自研请求体和签名机制 - 阿里云SDK - 阿里云 模版内容&#xff1a; <?phpnamespace common\components;use common\constant\UserConst; use common\models\bee\SmsReferer; use common\mode…