计算机中数值表示:原码、反码、补码与移码

1 前言

计算机科学中,数字的表示方式至关重要,因为计算机内部只能识别处理二进制数据。为了在计算机中实现对整数的表示,提出了多种数值编码方式,其中最常用的是原码、反码、补码和移码。

2 原码

2.1 原码的定义

原码(Signed Magnitude)是计算机中用来表示带符号整数的一种编码方式。在原码中,数值的符号(正负)和大小是分开表示的,其符号位用于标识符号(0表示正,1表示负),其余的位则表示该数值的绝对值。

2.2 原码的结构

假设我们使用n位二进制数来表示一个带符号整数,其中:

  • 最高位(符号位):用来表示数值的符号。0表示正数,1表示负数。
  • 其余(n-1)位:用来表示数值的绝对值。

以8位原码为例,其结构如下:

|符号位|数值位|
|-------|-------|
| 1 | 0110 | //表示-6
| 0 | 0110 | //表示+6

例如:

  • +5的原码表示为00000101,符号位为0,表示正数。
  • -5的原码表示为10000101,符号位为1,表示负数。

2.3 原码的优点

  • 直观易懂:原码的表示方式直接,容易理解和使用。数值的符号和大小是清晰分开的,可以方便地进行分析。
  • 简单转换:从十进制转换为原码相对简单,尤其是在仅处理小范围的正整数和负整数时。不需复杂的操作。

2.4 原码的缺点

  • 零的两种表示:在原码中,+0与-0均有不同的二进制表示,分别为00000000和10000000。这可能导致在计算过程中出现混淆,运算时得小心识别。
  • 加法和减法运算复杂:在进行加法和减法时,符号位需要特别处理。例如,两个数相加时需考虑符号,如果符号不同,需要先计算绝对值,再加上符号;如果符号相同,直接相加绝对值并保持符号。这使得运算规则相对复杂。
  • 效率低下:在进行大规模的数值计算时,由于对符号位的额外处理,运算时间和资源的消耗相对较高。

2.5 原码的运算

虽然原码简单明了,但进行加法和减法运算时会显得复杂。我们来举个例子:

加法运算

考虑两个数相加:+5(00000101)和-3(10000011),我们需要进行以下步骤:

  • 先提取符号位和数值部分。
  • +5为正数,-3为负数。
  • 计算绝对值的差:5 - 3 = 2。
  • 符号判断:由于5的符号为正,因此结果为00000010(+2)。

不过,如果处理两个负数相加,比如-5(10000101)和-3(10000011):

  • 先提取符号和数值部分。
  • 由于都是负数,先计算绝对值的和:5 + 3 = 8。
  • 符号判断:由于原码都是负的,所以结果为10001000(-8)。

在这个过程中,需要清除对符号的关注,来确保结果正确。

减法运算

减法在原码中同样复杂,通常需要将一个数的原码转换成对应的加法。

例如,计算-5(10000101)减去-3(10000011)相当于:-5 + 3。

  • -5的运算部分为10000101,-3的为10000011,求其绝对值差。
  • 计算-5 + +3,结果是-2,即10000010。

这样的运算继承了加法的复杂性,尤其是符号的处理和加减过程中的计算负数绝对值都显得较为繁琐。

3 反码

3.1 反码的定义

反码(One’s Complement)是一种用于表示带符号整数的编码方式。与原码相似,反码同样使用最高位作为符号位。但不同之处在于,反码是通过对原码中数值位进行“取反”来获得的:

  • 正数的反码与原码相同。
  • 负数的反码是其原码中除符号位外的所有位进行取反(0变成1,1变成0)。

以8位二进制数为例:

  • +5的原码是00000101,其反码也是00000101。
  • -5的原码是10000101,而其反码为11111010(位数取反)。

反码用于表示负数的主要目的,是希望通过简单的位操作使得计算机能够方便地进行加法与减法运算。

3.2 反码的结构

假设我们使用n位二进制数来表示带符号整数,其中:

  • 最高位(符号位):用来表示数值的符号。0表示正数,1表示负数。
  • 数值位:负数的数值位是原码数值位的取反。

例如,考虑8位反码的表示:

|符号位|数值位|
|-------|-------|
| 1 | 1101 | //表示-5的反码
| 0 | 0011 | //表示+3的反码

3.3 反码的优点

  • 计算简单性:反码使负数的表示简洁明了,相比原码在计算时更有利于运算。

  • 简单的减法实现:反码能够更容易地进行减法运算,减法可以通过加上被减数的反码来实现。

3.4 反码的缺点

  • 零的两种表示:和原码一样,反码也存在两个零的表示:+0(00000000)和-0(11111111)。这种二义性会对后续的计算造成困扰。
  • 运算复杂性:虽然反码能够简化减法,但在加法过程中仍然需要处理进位问题。如果符号位相同,需要加和并进行进位处理,而没有直接的加法运算规则。
  • 不直观:与原码相比,反码的直观性稍弱,尤其对于较复杂的数值操作,可能导致理解上的误区。

3.5 反码的运算

反码的加减法运算较为特殊,一般情况下需要注意如下几个点:

加法运算

进行反码的加法运算时,公式的关键是判断符号位:

  • 同符号相加:如果两个操作数的符号相同,直接将对应的数值位相加,同时保留符号位。
  • 不同符号相加:当符号位不同,需要减去较小绝对值,并保持符号。

考虑两个数的加法:

+5(原码为00000101,反码为00000101)
+ -3(原码为10000011,反码为11111100)

进行加法:

  00000101
+ 11111100
-----------
= 11111001

结果为11111001,需要对结果进行进位处理。在8位二进制中,11111001表示为-2(反码)。

减法运算

减法运算在反码中可通过加反码实现,即用被减数的反码替代减法。公式是:

A - B = A + (-B)

计算-5(反码为11111010)减去3(反码为00000011):

-5 - 3 = -5 + (-3) = -5 + 11111100

进行加法:

  11111010
+ 11111100
-----------
= 11110110

结果为11110110,表示-8,其中符号位为1,表示结果为负数。

4 补码

4.1 补码的定义

补码(Two’s Complement)是一种广泛用于计算机内部整数表示的编码方式。它解决了原码和反码中存在的一些问题,尤其是符号表示和结果的唯一性。补码的主要思想是将负数通过对原码取反后加1来表示,使得计算机能够以相同的硬件结构实现加、减运算。

4.2 补码的结构

在补码表示中,采用n位二进制数,其中:

  • 最高位(符号位):0表示正数,1表示负数。
  • 数值位:表示整数的值,负数的补码是通过对原码按位取反后加1而得到的。

以8位补码为例:

  • +5的原码为00000101,补码也是00000101。
  • -5的原码为10000101,首先取反为01111010,然后加1得到补码01111011,即10000111。

具体表示如下:

|符号位|数值位|
|-------|-------|
| 1 | 11111011 | //表示-5
| 0 | 00000101 | //表示+5

4.3 补码的计算规则

4.3.1 正数的补码

正数的补码与原码相同,最高位为0。

4.3.2 负数的补码

负数的补码计算过程为:

  • 取原码。
  • 对原码的数值位进行按位取反(除符号位外)。
  • 最后在得到的反码基础上加1。

例如,计算-3的补码:

  • 原码(-3)为10000011。
  • 按位取反得到11111100。
  • 加1得到11111101。

因此,-3在8位补码中为11111101。

4.4 补码的优点

  • 唯一零的表示:与原码和反码不同,补码只有一种0的表示方式,即00000000。这有效避免了对零的二义性问题。
  • 简化运算:由于加法和减法都可以通过补码实现,计算机设计中的电路和逻辑变得更加简便,所有的整数运算都可以通过加法器完成。这让硬件设计变得简洁高效,加速了运算过程。
  • 快速溢出检测:补码的加法运算能够方便地对溢出进行检测。当两个符号相同且结果符号不同,表示发生了溢出,这是在很多系统中进行错误检测的重要机制。

4.5 补码的缺点

  • 负数的表示范围:在进行数值表示时,补码的表示范围相对原码和反码有所差异,具体来说,使用n位补码表示时,负数范围为-2(n-1)到-1,而正数范围则为0到2(n-1)-1,可能导致表示范围限制。
  • 计算机处理复杂性:尽管补码做了一定的简化,在处理超大范围及浮点数时,仍然需要更复杂的运算机制。

4.6 补码的运算

加法运算

进行补码加法时,两个数的补码可以直接相加。如果结果中出现进位,需要注意符号的处理。

例如,计算 +5(00000101) 和 -3(11111101) 的加法:

  00000101 // +5
+ 11111101 // -3
-----------
  00000010 // +2

如果结果发生了进位,具体处理方式为:

  • 例如,计算 +100(01100100) 和 +28(00011100) 的补码相加:
  01100100 // +100
+ 00011100 // +28
-----------
  10000000 // 由于最高位为1,结果表示负数

这个操作要注意,当符号不同的数相加时,较大的数决定了结果的符号。

减法运算

减法运算可以通过补码的加法来实现,即 ( A - B ) 转换为 ( A + (-B) ),而 ( B ) 的补码就是 ( )的反码加上1。

例如,计算 -5(补码为11111011) 和 -3(补码为11111101) 的减法:

-5 - (-3) = -5 + 3

-5 的补码:11111011

3 的补码:00000011

  11111011 // -5
+ 00000011 // +3 (取3的补码)
-----------
  11111110 // 结果为-2

5 移码

5.1 移码的定义

移码是一种为了解决有符号数表示中的符号问题而产生的编码形式。通过对数值进行平移,移码确保了所有数值都是正数。因此,它可以将负数的表示转换为正数的范围。移码通常在某些应用中(如浮点数标准的指数部分)使用。

5.2 移码的表示方式

移码的基本想法是通过“偏移”来转换数值。在n位移码中,采用一个偏移量(K)对数值进行编码。偏移量是一个正数,通常取决于数值的范围。

对于一个具体的有符号整数x,如果要用n位移码表示,所使用的移码为:

[ \text{移码} = x + K ]

其中,K 通常为 (2^{(n-1)}),也就是将负数偏移到正数的表示空间。

例如,对于8位移码(n=8),K=127(即 (2^{(8-1)} - 1 = 127)):

  • 正数和零的移码直接加上127。
  • 负数的移码则是其绝对值加上127。

假设我们用8位表示移码,K=127:

  • +5 的移码表示: [ 5 + 127 = 132 \Rightarrow \text{二进制为} 10000100 ]
  • -5 的移码表示: [ -5 + 127 = 122 \Rightarrow \text{二进制为} 01111010 ]
    +0 的移码表示: [ 0 + 127 = 127 \Rightarrow \text{二进制为} 01111111 ]
    -1 的移码表示: [ -1 + 127 = 126 \Rightarrow \text{二进制为} 01111110 ]

在以上例子中,所有的数值都变成了正数的表示。

5.3 移码的优点

  • 统一处理正负数:移码的表示方式使得正数和负数都可以用相同方式处理,方便进行加减运算。
  • 避免了零的多重表示:在移码中,0只有一种表示方式,避免了原码和反码那种两种零的情况。
  • 简化了比较操作:由于移码的所有数值都是正数,数值之间的比较操作可以直接用无符号数的方式进行,算法简洁。
  • 易于实现加法:在硬件实现上,加法可以直接通过逻辑电路进行,不需要特别处理符号。

5.4 移码的缺点

  • 范围限制:移码的表示范围常常比某些其他表示形式小,例如在n位移码中,最大的正整数和最小的负整数的距离并不对称,这可能造成溢出问题。
  • 不直观:由移码表示的数值对于人类来说可能不够直观,例如需要进行加减运算时,需要先将结果转换回原数值。
  • 较少使用:和原码、补码等方法相比,移码的使用场景较少,易于理解和实现,但在现代编程中通常不作为主要数值表示方法。

5.5 移码的运算

移码的加减法运算比较直接。移码的加法规则通常遵循以下步骤:

加法运算

对于移码(a和b)进行加法时:

  • 直接相加:将两个移码直接相加。
  • 反回结果:相加后的结果要减去K(即可转换为原数值),但通常在计算机中采用相同数量的位表示,不需要改变。

例如,两个8位的移码:

a = 5(10000100)
b = 3(10000011)

求解 a + b = 10000100 + 10000011

这两个数相加,得到:

  10000100
+ 10000011
-----------
  00000111 (进位不会影响8位,溢出不处理)

结果为00000111,即原数值的6。

  • 如果轮换得到一个负数,需将结果加上127,转回对应的数值。

减法运算

移码减法可以通过将被减数的移码加上减数的移码。可以通过将减数转换为移码,再进行加法运算。

例如,计算5 - 3:

移码(a) = +5(10000100)
移码(b) = +3(10000011)

移码(b) 变成:-3 : -3 + 127 = 124 -> 01111100

= +5 + (-3) = 10000100 + 01111100

计算机内部,数值的不同表示方式有着各自的优缺点。原码直观但计算复杂,反码尝试简化减法运算却依然不能解决零的表示问题。补码则是最为广泛使用的表示法,解决了运算与表示的诸多问题。移码则在浮点数的表示中提供了一种有效的方案。

6 总结

  • 原码:正数是其二进制本身;负数是符号位为1,数值部分取X绝对值的二进制。
  • 反码:正数的反码和原码相同;负数是符号位为1,其它位是原码取反。
  • 补码:正数的补码和原码,反码相同;负数是符号位为1,其它位是原码取反,未位加1。(或者说负数的补码是其绝对值反码未位加1)
  • 移码:将符号位取反的补码(不区分正负)

举个例子以一个字节8位说明:

在这里插入图片描述
关系图:

在这里插入图片描述

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

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

相关文章

硬件实现I2C常用寄存器简单介绍

引言 在深入探讨I2C外设的具体案例之前,理解其核心寄存器的配置至关重要。这些寄存器不仅控制着I2C模块的基本操作模式,如数据传输速率和地址识别,还负责管理更复杂的通信需求,例如中断处理、DMA交互及错误检测与恢复。接下来的内…

分析用户请求K8S里ingress-nginx提供的ingress流量路径

前言 本文是个人的小小见解,欢迎大佬指出我文章的问题,一起讨论进步~ 我个人的疑问点 进入的流量是如何自动判断进入iptables的四表?k8s nodeport模式的原理? 一 本机环境介绍 节点名节点IPK8S版本CNI插件Master192.168.44.1…

linux中,软硬链接的作用和使用

一、软硬链接的作用 软硬链接,是大家所熟系的内容了。链接就是方便人使用电脑上访问文件、方便进程访问文件的工具。比如软连接大家都有见过,在安装某款软件的时候要不要添加快捷方式。在windows系统上,我们右键点击文件的时候按‘s’就能创建…

kalman滤波器C++设计仿真实例第三篇

1. 仿真场景 水面上有条船在做匀速直线航行,航行过程中由于风和浪的影响,会有些随机的干扰,也就是会有些随机的加速度作用在船身上,这个随机加速度的均方差大约是0.1,也就是说方差是0.01。船上搭载GPS设备,…

ubuntu20.04+RTX4060Ti大模型环境安装

装显卡驱动 这里是重点,因为我是跑深度学习的,要用CUDA,所以必须得装官方的驱动,Ubuntu的附件驱动可能不太行. 进入官网https://www.nvidia.cn/geforce/drivers/,选择类型,最新版本下载。 挨个运行&#…

[c语言日寄]浮点数在内存中的储存

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…

Yageo国巨的RC系列0402封装1%电阻库来了

工作使用Cadence多年,很多时候麻烦的就是整理BOM,因为设计原理图的时候图省事,可能只修改value值和封装。 但是厂家,规格型号,物料描述等属性需要在最后的时候一行一行的修改,繁琐又容易出错,过…

【文档智能】Qwen2.5-VL在版式分析和表格识别上的实际评测效果

qwen开年开源了Qwen2.5-VL系列权重模型,笔者观察到相较于传统的多模态系列,增加了文档理解功能。笔者以文档智能中两个比较重要的任务版式分析和表格识别,笔者直接测试下Qwen2.5-VL-72B的效果。 版式分析 case1 case2 这个case没有输出bbox…

【计算机组成原理】1_绪论

chap1 绪论 1. 国产芯片现状 MIPS阵营:龙芯X86阵营(常见于桌面和服务器):兆芯(VIA),海光(AMD)ARM阵营(常见于移动嵌入式、手机平板等)&#xff…

解锁反序列化漏洞:从原理到防护的安全指南

目录 前言 一、什么是反序列化 二、反序列化漏洞原理 三、反序列化漏洞的危害 (一)任意代码执行 (二)权限提升 (三)数据泄露与篡改 四、常见的反序列化漏洞场景 (一)PHP 反…

openGauss 3.0 数据库在线实训课程1:学习数据库状态查看

openGauss数据库状态查看 前提 我正在参加21天养成好习惯| 第二届openGauss每日一练活动 课程详见:openGauss 3.0.0数据库在线实训课程 学习目标 学习从操作系统层面和使用openGauss工具查看数据库的状态、版本和数据文件目录。 课程作业 gs_ctl是openGauss提…

[含文档+PPT+源码等]精品基于Python实现的django个性化健康餐计划订制系统

软件开发环境及开发工具: 开发语言:python 使用框架:Django 前端技术:JavaScript、VUE.js(2.X)、css3 开发工具:pycharm、Visual Studio Code、HbuildX 数据库:MySQL 5.7.26&am…

单机伪分布Hadoop详细配置

目录 1. 引言2. 配置单机Hadoop2.1 下载并解压JDK1.8、Hadoop3.3.62.2 配置环境变量2.3 验证JDK、Hadoop配置 3. 伪分布Hadoop3.1 配置ssh免密码登录3.2 配置伪分布Hadoop3.2.1 修改hadoop-env.sh3.2.2 修改core-site.xml3.2.3 修改hdfs-site.xml3.2.4 修改yarn-site.xml3.2.5 …

ZooKeeper单节点详细部署流程

ZooKeeper单节点详细部署流程 文章目录 ZooKeeper单节点详细部署流程 一.下载稳定版本**ZooKeeper**二进制安装包二.安装并启动**ZooKeeper**1.安装**ZooKeeper**2.配置并启动**ZooKeeper** ZooKeeper 版本与 JDK 兼容性3.检查启动状态4.配置环境变量 三.可视化工具管理**Zooke…

IMX6ULL环境搭建遇到的问题和解答更新

IMX6ULL环境搭建遇到的问题 开发板:正点原子IMX6ULL 终端软件串口控制:MobaXterm 1、网络环境搭建三方互ping不通 电脑无网口,使用绿联USB转网口,接网线直连开发板,电脑WiFi上网 按文档设置的 IP 地址,以…

Windows Docker笔记-Docker拉取镜像

通过在前面的章节《安装docker》中,了解并安装成功了Docker,本章讲述如何使用Docker拉取镜像。 使用Docker,主要是想要创建并运行Docker容器,而容器又要根据Docker镜像来创建,那么首当其冲,必须要先有一个…

51单片机07 串口通信

串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信。51单片机内部自带UART(Universal Asynchronous Recei…

外置互感器导轨式电能表

1 概述 1 Overview ADL系列导轨式多功能电能表,是主要针对于光伏并网系统、微逆系统、储能系统、交流耦合系统等新能源发电系统而设计的一款智能仪表,产品具有精度高、体积小、响应速度快、安装方便等优点。具有对电力参数进行采样计量和监测&#xff…

微软发布基于PostgreSQL的开源文档数据库平台DocumentDB

我们很高兴地宣布正式发布DocumentDB——一个开源文档数据库平台,以及基于 vCore、基于 PostgreSQL 构建的 Azure Cosmos DB for MongoDB 的引擎。 过去,NoSQL 数据库提供云专用解决方案,而没有通用的互操作性标准。这导致对可互操作、可移植…

开放式TCP/IP通信

一、1200和1200之间的开放式TCP/IP通讯 第一步:组态1214CPU,勾选时钟存储器 第二步:防护与安全里面连接机制勾选允许PUT/GET访问 第三步:添加PLC 第四步:点击网络试图,选中网口,把两个PLC连接起…