深入理解原码、反码和补码及其在计算机中的应用【附代码】

2023-11-07

目录

引言

一、原码(Sign-Magnitude)

二、反码(One's Complement)

三、补码(Two's Complement)

四、代码实例

结论

参考资料


引言

在计算机科学中,原码、反码和补码是表示有符号整数的三种常见编码方式。它们是为了解决计算机中整数运算的溢出问题而提出的。本文将详细介绍原码、反码和补码的概念、原理以及在计算机中的应用,并提供相关的C++代码示例。

一、原码(Sign-Magnitude)

原码是最简单的表示有符号整数的方式。它的规则很简单,即使用二进制表示数值的绝对值,最高位表示符号位(0表示正数,1表示负数)。例如,+5的原码为00000101,-5的原码为10000101。

原码的优点是直观简单,符号位可以直接判断正负。但是原码存在加减法运算时出现的溢出问题。

二、反码(One's Complement)

为了解决原码的溢出问题,反码被提出。反码的规则是:正数的反码与原码相同,负数的反码是对该数的原码按位取反。具体来说,就是将原码中的0变为1,1变为0。

例如,+5的反码仍为00000101,-5的反码为11111010。

反码解决了原码运算溢出的问题,但是存在“0”的两个表示(正0和负0),并且减法运算仍然存在一些问题。

三、补码(Two's Complement)

为了进一步解决反码的问题,补码被引入。补码的规则是:正数的补码与原码相同,负数的补码是对该数的反码加1。

例如,+5的补码仍为00000101,-5的补码为11111011。

补码解决了反码存在的“0”的两个表示问题,并且能够正确进行加减法运算。此外,补码还具有以下几个特点:
1. 补码表示的范围比原码和反码多一个数值。
2. 补码中最高位(最左侧)的1表示负数,其余位是数值位。
3. 补码中的正数和负数可以直接进行二进制运算。

在计算机中,补码广泛应用于整数运算、逻辑运算以及表示负数等方面。

四、代码实例

下面是使用C++实现原码、反码和补码转换的示例代码:

#include <iostream>

// 转换为二进制字符串
std::string toBinaryString(int num) {
    std::string binaryStr = "";
    for (int i = 31; i >= 0; i--) {
        binaryStr += ((num >> i) & 1) ? "1" : "0"; 
    }
    return binaryStr;
}

// 原码转补码
int signMagnitudeToTwosComplement(int num) {
    if ((num & 0x80000000) != 0) {  // 负数的符号位为1
        num = ~num;  // 取反
        num += 1;   // 加1
    }
    return num;
}

// 补码转原码
int twosComplementToSignMagnitude(int num) {
    if ((num & 0x80000000) != 0) {  // 负数的符号位为1
        num = ~(num - 1);   // 减1后取反
    }
    return num;
}

int main() {
    int num = -5;
  
    std::cout << "原码:" << toBinaryString(num) << std::endl;
    std::cout << "补码:" << toBinaryString(signMagnitudeToTwosComplement(num)) << std::endl;
    std::cout << "还原为原码:" << toBinaryString(twosComplementToSignMagnitude(signMagnitudeToTwosComplement(num))) << std::endl;
  
    return 0;
}

以上代码将输出:

原码:11111111111111111111111111111011
补码:11111111111111111111111111111011
还原为原码:10000000000000000000000000001011

结论

原码、反码和补码是表示有符号整数的三种编码方式。原码简单直观但存在溢出问题,反码通过取反解决了溢出问题但引入了“0”的两个表示,而补码在此基础上通过加1消除了“0”的两个表示,并能够正确进行加减法运算。在计算机中,补码被广泛应用于整数运算、逻辑运算和负数的表示等方面。深入理解原码、反码和补码的概念及其应用,对于理解计算机内部的数字表示和处理方式具有重要意义。

参考资料

  • Patterson, D., & Hennessy, J. L. "Computer Organization and Design: The Hardware/Software Interface." Morgan Kaufmann Publishers, 2017.
  • Bryant, R. E., & O'Hallaron, D. R. "Computer Systems: A Programmer's Perspective." Pearson, 2016.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深入理解原码、反码和补码及其在计算机中的应用【附代码】 的相关文章

  • 一元 +/- 运算符如何可能导致“-a”或“+a”中的整数提升,“a”是算术数据类型常量/变量?

    这句看似微不足道的台词摘自我的迈克 巴纳汉和布雷迪的 C 书 第 2 8 8 2 节 http publications gbdirect co uk c book chapter2 expressions and arithmetic h
  • 如何在 Bean Validation 1.0 中构造 ConstraintViolationException?

    我对 javax validation API 感到困惑 我正在编写一个简单的测试来理解它 Sample sample new Sample Set
  • C# 编译器不会优化不必要的强制转换

    前几天 在写答案的时候这个问题 https stackoverflow com questions 2208315 why is any slower than contains在这里 关于溢出 我对 C 编译器感到有点惊讶 它没有按照我的
  • JAXB 编组器无参数默认构造函数

    我想从 java 库中编组一个 java 对象 当使用 JAXB marschaller 编组 java 对象时 我遇到了一个问题 A 类没有无参数默认构造函数 我使用Java Decompiler来检查类的实现 它是这样的 public
  • UI 函数在快速事件完成之前触发

    我有一个停靠在 Silverlight 应用程序中的 Web 浏览器框架 有时会在其上弹出全窗口 XAML Silverlight UI 元素 我已经或多或少修复了一个老问题 即 Web 框架的内容似乎与 Silverlight 内容不能很
  • Java8:流映射同一流中的两个属性

    我有课Model带有以下签名 class Model private String stringA private String stringB public Model String stringA String stringB this
  • 搜索实体的所有字段

    我正在尝试在客户数据库上实现 多功能框 类型的搜索 其中单个查询应尝试匹配客户的任何属性 这是一些示例数据来说明我想要实现的目标 FirstName LastName PhoneNumber ZipCode Mary Jane 12345
  • 使用具有抗锯齿功能的 C# 更改抗锯齿图像的背景颜色

    我有一个图像需要更改背景颜色 例如 将下面示例图像的背景更改为蓝色 然而 图像是抗锯齿的 所以我不能简单地用不同的颜色替换背景颜色 我尝试过的一种方法是创建第二个图像 仅作为背景 并更改其颜色并将两个图像合并为一个图像 但是这不起作用 因为
  • Project Euler #8,我不明白我哪里出了问题[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在做项目欧拉第八题 https projecteuler net problem 8 其中我得到了这个大得离谱的数字 7316
  • 英文日期差异

    接近重复 如何计算相对时间 https stackoverflow com questions 11 how do i calculate relative time 如何在 C 中计算某人的年龄 https stackoverflow c
  • 在 OpenGL 中渲染纹理 1 到 1

    所以我想做的是使用 OpenGL 和 C 将纹理渲染到平面上 作为显示图像的一种方式 但是我需要确保在渲染纹理时没有对纹理进行任何处理 抗锯齿 插值 平滑 模糊等 这是 OpenGL 处理渲染纹理的默认方式吗 或者是否需要设置一些标志才能禁
  • 选择查询不适用于使用Parameters.AddWithValue 的参数

    C 中的以下查询不起作用 但我看不出问题所在 string Getquery select from user tbl where emp id emp id and birthdate birthdate cmdR Parameters
  • JPA 将 BigDecimal 作为整数保存在数据库中

    我在数据库中有这个字段 ITEMCOST NUMERIC 13 DEFAULT 0 NOT NULL 在JAVA中 Entity中的字段定义如下 Column name ITEMCOST private BigDecimal itemCos
  • 如何停止无限循环?

    我正在编写一个程序 该程序将计算三角形或正方形的面积 然后提示用户是否希望计算另一个 我的代码已经运行到可以计算任一形状的面积的程度 但随后不再继续执行代码的其余部分 例如 如果选择了正方形 则计算面积 然后返回到正方形边长的提示 我假设这
  • 使用 jQuery 从 ASP.Net JSON 服务获取数据

    我正在尝试调用 Google 地图地理编码 API 从纬度 经度对中获取格式化的地址 然后将其记录到控制台 我正在尝试获取为给定位置返回的第一个 formatted address 项目 我很简单无法从 JSON 中提取该项目 我不知道为什
  • 如何清理 Runtime.exec() 中使用的用户输入?

    我需要通过命令行调用自定义脚本 这些脚本需要很少的参数并在 Linux 机器上调用 当前版本容易出现各种shell注入 如何清理用户给出的参数 参数包括登录名和路径 Unix 或 Windows 路径 用户应该能够输入任何可能的路径 该路径
  • LINQ 中的“from..where”或“FirstOrDefault”

    传统上 当我尝试从数据库中获取用户的数据时 我使用了以下方法 在某种程度上 DbUsers curUser context DbUsers FirstOrDefault x gt x u LoginName id string name c
  • 使用自定义比较器在 Java 中创建 SortedMap

    我想创建一个TreeMap在 Java 中具有自定义排序顺序 排序后的键是字符串 需要根据第二个字符进行排序 这些值也是字符串 示例地图 Za FOO Ab Bar 您可以像这样使用自定义比较器 Comparator
  • 来自 3rd 方库的链接器错误 LNK2019

    我正在将旧的 vc 6 0 应用程序移植到 vs2005 我收到以下链接器错误 我花了几天时间试图找到解决方案 错误LNK2019 无法解析的外部符号 imp 创建AwnService 52 在函数 public int thiscall
  • 如何使用 Jest 从 ElasticSearch 获取索引列表

    我正在尝试使用 Jest 检索索引列表 但我只得到 Stats statistics new Stats Builder build result client execute statistics 如何从结果中检索索引列表 除了统计之外

随机推荐

  • vite入坑之路:react+vite动态导入报错@vite-ignore的解决方法

    正常的动态组件导入方式 webpack搭建的项目 不管是react还是vue通常引入动态组件基本这么写 const url import pages locale vite不支持 or const url import pages loca
  • 免费的mathematica

    这里说的不是破解版 而是mathematica官方推出的免费版 没有笔记本界面等一些功能 可以在命令行使用 不过可以配置jupyter使用啊 安装 直接按照官方的提示安装就好了 http support wolfram com kb 460
  • 数据库核心

    package com example moni tab import android content ContentValues import android database Cursor import android database
  • taro不同的项目中使用不同版本的taro-cli

    这里写目录标题 preface 解决方案 1 局部安装 tarojs cli 2 测试 局部是否可以使用 tarojs cli preface 我有两个 taro 项目 写的时间前后差距半年多了 现在 taro 版本不一致 分别是 1 3
  • WTL 界面设计篇(CSkinDialog)

    头文件声明 CSkinDialog h pragma once include
  • Yolov5 优化,包括Yolov8 c2f模块

    目录 各种技巧实战测试 decouple head yolo中添加 Yolov5 Yolov7加入Yolov8 c2f模块 小目标涨点 1 加入backbone 2 加入head 各种技巧实战测试 基于Yolov5的道路缺陷识别 加入CVP
  • keil5调试代码常见的警告与错误整理

    1 warning 1295 D Deprecated declaration run c give arg types void run c 原函数 void run c void 改正后 对比前面声明的函数 发现是括号少了一个void
  • Spring Cloud架构的各个组件的原理分析

    点击上方 芋道源码 选择 设为星标 管她前浪 还是后浪 能浪的浪 才是好浪 每天 10 33 更新文章 每天掉亿点点头发 源码精品专栏 原创 Java 2021 超神之路 很肝 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网
  • vue之router钩子函数

    模块一 全局导航钩子函数 1 vue router beforeEach 全局前置守卫 beforeEach的钩子函数 它是一个全局的before 钩子函数 before each 意思是在 每次每一个路由改变的时候都得执行一遍 它的三个参
  • SQL之变量的使用和赋值

    MySQL的用户变量 变量 变量名 比如 var 申明变量 set 变量名 比如 set var 只是申明 不显示 select 变量名 比如 select var 只是申明 显示 select num 字段名 from 表名 where
  • python 人工智能库_基于python的机器学习库 - 全文

    毫无疑问 神经网络和机器学习在过去几年一直是高科技领域最热门的话题之一 这一点很容易看出 因为它们解决了很多真正有趣的用例 如语音识别 图像识别 甚至是乐曲谱写 PyBrain的概念是将一系列的数据处理的算法封装到被称之为Module的模块
  • STM32F407单片机读取USR-WIFI232-B2模块的MAC地址

    最近工程项目需要单片机读取USR WIFI232 B2 WIFI 模块的MAC地址 研究了一下 并成功获取了MAC地址 步骤如下 1 单片机上电 USR WIFI232 B2 WIFI 模块先延时12秒 等待模块准备好 2 单片机给USR
  • 面试小结-那些求职路上的经验分享与感受

    世界那么大 我想去看看 世界那么大 我也想去看看 这个月 小吕完成了一次工作上的跳槽 在这种全民跳槽的月份 小吕的心情显的稍有些浮躁 工作上也怠慢了很多 虽然这个月的工作量也不大 没有心思钻研技术 也不能好好静下心来学习 我不喜欢现在这状态
  • flask昌平区安防摄像头可视化

    flask昌平区安防摄像头可视化 此系统有详细的录屏 下面只是部分截图 需要看完整录屏联系博主 系统开发语言python 框架为flask 数据库mysql 分为爬虫和可视化分析
  • 获取当月天数

    获取当月天数 需要导入import java util Calendar String time 2023 2 14 Calendar calendar Calendar getInstance Date data new SimpleDa
  • osgEarth的Rex引擎原理分析(十)earth文件中都有哪些options

    目标 九 中问题9 通过在earth文件中搜索options 发现主要有这么几种
  • 添加和修改docker容器端口映射的方法

    一 添加docker容器端口映射 以tomcat容器为例 root localhost docker run name mytomcat d p 8888 8080 tomcat name 创建的tomcat镜像名称 d 后台运行 p 将主
  • CTF中phpinfo应注意什么

    CTF中 phpinfo应注意什么 1 allow url fopen和allow url include 这个配置选项可以知道在PHP文件包含中可以使用哪些伪协议 2 PHP版本 3 open basedir 这个配置选项可以知道PHP将
  • eclipse打开之后没有界面

    自己工作的电脑上的eclipse经常打开之后没有界面显示出来 但是后台有eclipse和java的进程在运行 这个时候要进入到当前eclipse选择的工作目录 也就是打不开eclipse界面的那个工作目录 中的 gt metadata pl
  • 深入理解原码、反码和补码及其在计算机中的应用【附代码】

    目录 引言 一 原码 Sign Magnitude 二 反码 One s Complement 三 补码 Two s Complement 四 代码实例 结论 参考资料 引言 在计算机科学中 原码 反码和补码是表示有符号整数的三种常见编码方