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

news2024/12/23 20:32:35

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

奇怪的数学定义

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

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

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

等价类: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

补码是现在主流的格式,所以各种考试也主要考补码。所以只讲一下补码的计算。

补码计算的时候,加减法要带着符号位进行,乘除法就是左移补0,右移补符号位

比如:

  • 1011*2,得到的是0110
  • 1011/2,得到的是1101
  • 0011+0011,也就是3+3=6=0110
 0011
+0011
-------
 0110
  • 0011-0111,也就是3-7=-4=1110
 0011
-0111
-------
 1100

用加减法可以很容易得到-x对应的二进制,反之亦然。

举个例子,我要计算出1111 0100的的十进制,那么可以先计算出和-1(1111 1111)的差(前 4 位相同,甚至可以不用写):

 0000 0000
-1111 0100
-----------
 0000 1100

得到12,加上符号-(原二进制符号位为1,也就是负的),那么最后得到-12

反之,我们想计算出-8的二进制,也就是和08(0000 1000),那么就可以:

 0000 0000
-0000 1000
-----------
 1111 1000

是不是很简单。

反码(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 - 维基百科

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【元器件】二极管、三极管、MOS管

二极管 D 二极管是一种具有两个电极(即正极和负极)的电子器件。它是一种非线性元件,具有许多重要的功能和应用 三极管 Q 概述 一种控制电流的半导体器件,其作用是把微弱信号放大成幅度值较大的电信号,也用作无触点开…

代理IP服务中的代理池大小有何影响?

在当今数字化时代,网络爬虫已经成为获取各类信息必不可少的工具。在大规模数据抓取中,使用单一 IP 地址或同一 IP 代理往往会面临抓取可靠性降低、地理位置受限、请求次数受限等一系列问题。为了克服这些问题,构建代理池成为一种有效的解决方…

TikTok账号矩阵运营怎么做?

这几年,聊到出海避不过海外抖音,也就是TikTok,聊到TikTok电商直播就离不开账号矩阵; 在TikTok上,矩阵养号已经成为了出海电商人的流行策略,归根结底还是因为矩阵养号可以用最小的力,获得更大的…

沧穹科技助力杭州东站网约车服务全面升级

沧穹科技助力杭州东站完成网约车智能化服务全面革新升级,这一举措显著提升了杭州东站网约车服务的效率与乘客体验。以下是对这一革新升级的详细解析: 一、革新背景 随着网约车行业的快速发展,杭州东站作为华东地区重要的交通枢纽,…

VRRP虚拟路由冗余技术

VRRP虚拟路由冗余技术:是一种路由容错协议,用于在网络中提供路由器的冗余备份。它通过将多个路由器虚拟成一个虚拟路由器并且多个路由器之间共享一个虚拟IP地址来实现冗余和高可用性。当承担转发业务的主路由器出现故障时,其他备份路由器可以…

输出调节求解跟踪问题(二阶线性系统)

本文研究了一种基于增广系统的领导者-跟随者控制框架,旨在实现跟随者系统对领导者参考信号的精确跟踪。首先,建立了跟随者和领导者的独立状态空间方程,分别描述了它们的动态行为和输出关系。随后,通过将两者的状态空间方程结合成增…

AI口语练习APP的技术挑战

实现基于大模型的口语练习系统是一项复杂且具有挑战性的任务,涉及多项技术和工程难点。以下是一些主要的技术难点。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1. 语音识别准确率 口语练习APP需要能够准确识别用户的语…

探索Python自然语言处理的新篇章:jionlp库介绍

探索Python自然语言处理的新篇章:jionlp库介绍 1. 背景:为什么选择jionlp? 在Python的生态中,自然语言处理(NLP)是一个活跃且不断发展的领域。jionlp是一个专注于中文自然语言处理的库,它提供了…

智慧消防建设方案(完整方案参考PPT)

智慧消防系统建设方案旨在通过物联网、大数据与云计算技术,集成火灾自动报警、智能监控、应急指挥等功能于一体。方案部署智能传感器监测火情,实时数据分析预警,实现火灾早发现、早处置。构建可视化指挥平台,优化应急预案&#xf…

Google资深工程师深度讲解Go语言-课程笔记

课程目录: 第1章 课程介绍 欢迎大家来到深度讲解Go语言的课堂。本课程将从基本语法讲起,逐渐深入,帮助同学深度理解Go语言面向接口,函数式编程,错误处理,测试,并行计算等元素,并带…

高性能内存对象缓存Memcached

memcached常用架构 memcached分布式示例图 一致性hash算法简单示例图

Yum包下载

1. 起因 内网有一台服务器需要升级php版本,维护的同学又不想二进制安装.服务器只有一个光盘的yum仓库 2. 解决方法 解决思路如下: 外网找一台机器配置php8.3.8的仓库外网服务器下载软件集并打包内网服务器上传并解压实现升级 2.1 下载php8.3.8仓库 配置php仓库 rootcent…

SQL 子查询中,查询了一个不存在的字段,居然不报错

前言 前几天在做一个需求,用户所在的部门被删除了,对应用户的角色也要清空。测试测的时候发现,只要测我的这个需求系统的所有角色都被删除了。。。。。。。 我看了日志也没报错呀,我也没有删除所有账号的角色呀。我有点不相信&a…

(一)原生js案例之图片轮播

原生js实现的两种播放效果 效果一 循环播放&#xff0c;单一的效果 代码实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sc…

4款良心软件,免费又实用,内存满了都舍不得卸载

以下几款高质量软件&#xff0c;若是不曾体验&#xff0c;实在是遗憾可惜。 PDF Guru 这是一款开源免费的PDF编辑软件&#xff0c;打开之后功能一目了然。 可以拆分、合并PDF&#xff0c;也可以给PDF添加水印和密码&#xff0c;同时也可以去除别人PDF里的水印或密码&#xff0…

状态管理的艺术:探索Flutter的Provider库

状态管理的艺术&#xff1a;探索Flutter的Provider库 前言 上一篇文章中&#xff0c;我们详细介绍了 Flutter 应用中的状态管理&#xff0c;以及 StatefulWidget 和 setState 的使用。 本篇我们继续介绍另一个实现状态管理的方式&#xff1a;Provider。 Provider优缺点 基…

Spock单元测试框架使用介绍和实践

背景 单元测试是保证我们写的代码是我们想要的结果的最有效的办法。根据下面的数据图统计&#xff0c;单元测试从长期来看也有很大的收益。 单元测试收益: 它是最容易保证代码覆盖率达到100%的测试。可以⼤幅降低上线时的紧张指数。单元测试能更快地发现问题。单元测试的性…

STM32 UART 硬件结构

访问串口与读写内存无差&#xff0c;串口将寄存器中的值通过数据线一位一位的传输出去 协议 设置波特率&#xff0c;数据位 115200 8 n 1 BSRR/CR 查询方式进行数据的发送与接收 &#xff08;在一个while循环中判断状态&#xff0c;然后读取数据&#xff09; 1、发送…

在线商城系统带万字文档java项目java课程设计java毕业设计

文章目录 在线商城系统一、项目演示二、项目介绍三、万字项目文档四、部分功能截图五、部分代码展示六、底部获取项目源码带万字文档&#xff08;9.9&#xffe5;带走&#xff09; 在线商城系统 一、项目演示 在线商城系统 二、项目介绍 基于springbootvue的前后端分离在线商…

Vue3滚动条(Scrollbar)

效果如下图&#xff1a;在线预览 APIs Scrollbar 参数说明类型默认值必传contentStyle内容样式CSSProperties{}falsesize滚动条的大小&#xff0c;单位 pxnumber5falsetrigger显示滚动条的时机&#xff0c;none 表示一直显示‘hover’ | ‘none’‘hover’falsehorizontal是否…