认识原码反码补码

news/2024/9/17 13:51:24/ 标签: c语言

目录

一.何为原码反码和补码?

(1)原码

(2)反码

(3)补码

(4)总结

二.原反补之间的简单计算

(1)补码加法

(2) 补码减法

(3) 溢出问题


一.何为原码反码和补码?

(1)原码

原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。

  • 符号位:最高位(最左边的位)用于表示符号,0 表示正数,1 表示负数。
  • 数值部分:其余的位用于表示数值的绝对值。

例如,在 8 位二进制中:

  • +5 表示为:0000 0101(最左边的0表示正数)
  • -5 表示为:1000 0101(最右边的1表示负数)

(2)反码

反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。

  • 正数:反码和原码一样。
  • 负数:反码为原码的按位取反。

例如,在 8 位二进制中:

  • +5 的反码:0000 0101(与原码相同)
  • -5 的反码:1111 1010(将原码的数值部分按位取反)

(3)补码

补码:反码+1就得到补码。

  • 正数:补码与原码相同。
  • 负数:负数的补码为反码加 1。

例如,在 8 位二进制中:

  • +5 的补码:0000 0101(与原码相同)
  • -5 的补码:1111 1011(反码 1111 1010 + 1 = 1111 1011

(4)总结

数值原码反码补码
+50000 01010000 01010000 0101
-51000 01011111 10101111 1011
+00000 00000000 00000000 0000
-01000 00001111 11110000 0000

二.原反补之间的简单计算

(1)补码加法

补码的加法与普通的二进制加法相同,不区分正负数。无论是正数加正数、正数加负数,还是负数加负数,计算机只需将它们的补码相加,溢出的位自动丢弃。

例子:

例子 1:正数加法

计算 5 + 3,用 8 位补码表示:

  • 5 的补码是:0000 0101
  • 3 的补码是:0000 0011
  0000 0101
+ 0000 0011
------------0000 1000   (结果为 8,正确)

例子 2:正数加负数

计算 5 + (-3),用 8 位补码表示:

  • 5 的补码是:0000 0101
  • -3 的补码是:1111 1101(原码是0000 0011)(3 的反码 1111 1100 加 1)
  0000 0101
+ 1111 1101
------------0000 0010   (结果为 2,正确)

溢出的位被自动丢弃,所以结果保持正确。

(2) 补码减法

减法可以通过将减数的补码取反(即变成负数),然后与被减数相加来实现。因此,减法实际上也是通过加法来处理的。

例子 3:正数减法计算 5 - 3,相当于 5 + (-3),用 8 位补码表示:

  • 5 的补码是:0000 0101
  • -3 的补码是:1111 1101
  0000 0101
+ 1111 1101
------------0000 0010   (结果为 2,正确)

例子 4:负数减负数

计算 -5 - (-3),相当于 -5 + 3,用 8 位补码表示:

  • -5 的补码是:1111 1011
  • 3 的补码是:0000 0011
  1111 1011
+ 0000 0011
------------1111 1110   (结果为 -126,正确)

看上面3个例子结果都是对的,为什么到这里结果就不是-2了呢?

这是因为正数他的原反补都是相同的,我们一般都是用补码来计算两个数的相加或相减,然后再将计算出来的结果转换为原码,最后计算出最终结果,我们前面三个例子计算出来的都是正数,原反补都一样,所以是正确的。

至于这第四个例子,负数得先转换原码,我在这里教大家一个快速计算由补码转换为原码的方法:
 

从最右边开始找,找到第一个1,然后在他的前一位加1就可以得到原码
对于本题:1111 1110
+      1
-------------
10000 0010(显然是-2)

补充:由于计算机中采用补码表示法进行加法运算时,可以将有符号整数的加法统一为无符号整数的加法,并且如果最高位(符号位)有进位,则忽略该进位。因此,我们可以直接进行二进制加法运算而不考虑符号位的进位。

(3) 溢出问题

在使用补码进行加减法时,可能会出现 溢出。溢出是指结果超出了可表示的范围。例如,8 位补码可以表示 -128 到 127 的数值,超过这个范围的结果会出现错误。

例子 5:溢出

计算 120 + 10,用 8 位补码表示:

  • 120 的补码是:0111 1000
  • 10 的补码是:0000 1010
  0111 1000
+ 0000 1010
------------1000 0010   (结果为 -126,溢出)

解释:因为 8 位补码最大能表示的数是 127,但实际结果 130 超出了范围,导致溢出并得到一个错误的结果(-126)。


http://www.ppmy.cn/news/1525180.html

相关文章

uniapp数据缓存和发起网络请求

数据缓存 uni.onStorageSync同步的方式将数据存储到本地缓存 <template><button click"onStorageSync()">存储数据</button> </template><script setup>const onStorageSync () > {// 存储数据uni.setStorageSync(username, 张三)…

Python——爬虫(2)

要使用Python爬取B站热门视频&#xff0c;可以使用第三方库requests和BeautifulSoup来实现。 首先&#xff0c;你需要安装这两个库。你可以使用以下命令在终端或命令提示符中安装它们&#xff1a; pip install requests beautifulsoup4接下来&#xff0c;你可以使用以下代码来…

使用Astra DB和LangChain构建高效的RAG系统:从入门到实践

使用Astra DB和LangChain构建高效的RAG系统&#xff1a;从入门到实践 1. 引言 检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;简称RAG&#xff09;是一种结合了信息检索和文本生成的AI技术&#xff0c;能够显著提升大语言模型的表现。本文将介绍如何使…

React Native 0.76版本发布

关于 React Native 的 New Architecture 概念&#xff0c;最早应该是从 2018 年 RN 团队决定重写大量底层实现开始&#xff0c;因为那时候 React Native 面临各种结构问题和性能瓶颈&#xff0c;最终迫使 RN 团队开始进行重构。 而从 React Native 0.68 开始&#xff0c;New A…

buildroot移植qt报错Info: creating stash file (补充qt添加字库)

移植qt库&#xff0c;编译文件报错Info: creating stash file /home/rbing/QT/uart/.qmake.stash Project ERROR: Unknown module(s) in QT: serialport rbingouc:~/QT/uart$ /home/rbing/linux/tool/buildroot-2022.02.9/output/host/usr/bin/qmake Info: creating stash fil…

ssm“健康早知道”微信小程序 LW PPT源码调试讲解

第二章开发技术与环境配置 以Java语言为开发工具&#xff0c;利用了当前先进的SSM框架&#xff0c;以MyEclipse10为系统开发工具&#xff0c;MySQL为后台数据库&#xff0c;开发的一个“健康早知道”微信小程序。 2.1 Java语言简介 Java是由SUN公司推出&#xff0c;该公司于2…

梧桐数据库(WuTongDB):数据库技术中都有哪些常见的优化器

以下是一些常见的数据库优化器&#xff1a; 1. CBO&#xff08;Cost-Based Optimizer&#xff09; 应用场景&#xff1a;广泛应用于关系型数据库中&#xff0c;如Oracle、PostgreSQL、MySQL等。工作原理&#xff1a;通过计算不同执行计划的代价&#xff08;如CPU、I/O等资源消…

RabbitMQ延迟消息——DelayExchange插件

什么是死信以及死信交换机 当一个队列中的消息满足下列情况之一时&#xff0c;可以成为死信&#xff1a; 1. 消费者使用basic.reject或 basic.nack声明消费失败&#xff0c;并且消息的requeue参数设置为false 2. 消息是一个过期消息&#xff0c;超时无人消费 3. 要投递的队列消…

美国洛杉矶ip有哪些独特优势

美国洛杉矶的IP地址独特优势主要体现在以下几个方面&#xff0c;rak小编为您整理发布美国洛杉矶的IP地址独特优势&#xff0c;希望 对您选择服务器有帮助。 1. 丰富的IP资源&#xff1a;美国洛杉矶多IP服务器提供的IP数量从几十到几百不等&#xff0c;最多可提供多达511个独立I…

使用Django 搭建自动化平台

由于本人python 环境已安装&#xff0c;就不重复安装了&#xff0c;博客中有python的安装说明&#xff1b; 1 Django 的安装 安装很简单&#xff1a; pip install django 但是国内的网络环境&#xff0c;你很难成功&#xff0c;此处省略一些字。。。。。 问题总要解决&#…

QT QObject源码学习(二)

一、全局函数 1、qt_qFindChildren_helper函数 在给定的父对象下&#xff0c;查找所有匹配指定条件的子对象&#xff0c;并将它们添加到一个列表中。 &#xff08;1&#xff09;声明 /*** brief 在给定的父对象下&#xff0c;查找所有匹配指定条件的子对象&#xff0c;并将它…

Leetcode3275. 第 K 近障碍物查询

Every day a Leetcode 题目来源&#xff1a;3275. 第 K 近障碍物查询 解法1&#xff1a;大根堆 维护前 k 小元素&#xff0c;可以用最大堆。 遍历数组 queries&#xff0c;计算点 (x,y) 到原点的曼哈顿距离 d∣x∣∣y∣。 把 d 入堆&#xff0c;如果堆大小超过 k&#xff…

clickhouse 保证幂等性

在分布式数据库系统 ClickHouse 中&#xff0c;幂等性通常涉及到在相同的操作被重复执行时&#xff0c;保证结果不会因为多次执行而发生变化。为了确保幂等性&#xff0c;ClickHouse 采用了一些机制来避免数据重复插入或处理。 以下是 ClickHouse 保证幂等性的一些关键机制&am…

SpringBoot的Web开发支持

使用spring-boot-starter-web启动器&#xff0c;开始web支持&#xff0c;内嵌一个Tomcat&#xff0c;添加了对于SpringMVC的支持。Spring Boot默认servlet容器为tomcat。 常用的服务器配置 配置端口号Spring Boot 默认端口是8080&#xff0c;如果想要进行更改的话&#xff0c;…

使用docker Desktop docker build 报错 无法拉取 nginx 镜像

具体报错信息&#xff1a;ERROR: failed to solve: nginxinc/nginx-unprivileged:alpine: failed to resolve source metadata for docker.io/nginxinc/nginx-unprivileged:alpine: failed to authorize: failed to fetch oauth token: Post "https://auth.docker.io/toke…

支持iPhone 16新品预售,饿了么同步上线专人配送等特色服务

9月10日凌晨&#xff0c;2024年 Apple 秋季新品发布会上正式揭晓iPhone 16新机。9月10日一早&#xff0c;饿了么同步宣布&#xff1a;今年将携手近4000家Apple 授权专营店&#xff0c;支持iPhone 16新品预售及现货的同步开售。新机现货首发当日&#xff0c;饿了么消费者最快半小…

下载docker镜像报错,dial tcp x.x.x.x:443: connect: connection refused

原因是:国外的连接超时了. 解决方案改为阿里云的数据源 打开阿里云 搜索&#xff1a;容器镜像服务 ACR 把你自己的这个直接复制在linux sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF { "registry-mirrors": ["你自己的"] }…

Machine Learning: A Probabilistic Perspective 机器学习:概率视角 PDF免费分享

下载链接在博客最底部&#xff01;&#xff01; 之前需要参考这本书&#xff0c;但是大多数博客都是收费才能下载本书。 在网上找了好久才找到免费的资源&#xff0c;浪费了不少时间&#xff0c;在此分享以节约大家的时间。 链接: https://pan.baidu.com/s/1erFsMcVR0A_xT4fx…

用于客户支持的 GenAI:探索 Elastic Support Assistant

作者&#xff1a;Chris Blaisure, Cory Mangini 我们很高兴地宣布推出 Elastic 的支持助手。本博客将带你了解我们最新的生成式 AI 工具以及它可以帮助你使用 Elastic 技术的一些常见场景。 Elastic 支持助手现已在 Support Hub 上可用 今天&#xff0c;我们宣布 Elastic 支持…

【C++多线程编程】 线程安全与对象生命周期管理

目录 类的线程安全 实现线程安全 构造函数在多线程中的安全性 析构函数多线程环境的安全 智能指针实现多线程安全 shared_ptr 非完全线程安全 shared_ptr可能导致对象生命周期延长 const引用可以减少传递shared_ptr开销 shared_ptr 智能指针块模块的优点 析构所在线程…