【C语言】原码 反码 补码

news2024/10/21 11:44:48
为什么要有原码 反码 补码的概念?

因为在计算机中最终只能识别机器码,是以 0000 0000 二进制作为表示形式,对于一个数,计算机要使用一定的编码方式进行存储,原码 反码 补码是机器存储一个数值的编码方式,最终,在计算机里都是以补码的形式来存储数据的。而且,计算机基本都只支持加法,例如: 1-1 ----> 在计算机中计算时实际上是:1 + -1,下面我们来看看这个过程。

原码 反码 补码:
			原码 : 是人分析的码,给人看的 ---> 将一个数转为二进制形式,用最高位表示正负。
            反码 : 构建原码和补码的桥梁 ---> 在原码的基础上,符号位不变,其他位取反
            补码 : 是机器码,用来机器存储的 ---> 在反码的基础上 +1(符号位参与运算符,正数的补码就是原码)

任何的数值,都会有拥有其对应的二进制格式 
    正数: 1  ---> 0| 000 0000 0000 0001 
    	  2  ---> 0| 000 0000 0000 0010
    	  3  ---> 0| 000 0000 0000 0010
    负数: -1 ---> 1| 000 0000 0000 0001  --->最高位:1 --> 因为第一位是符号位,表示数值的正负,这里是:负数 
   或者,有另外一种术语:*将带符号位的机器数对应的真正数值*称为*机器数的真值*。
   		0000 0001 的真值= +000 0001 = +1
   	1000 0001 的真值= -000 0001 = -1
   	所以,8位二进制数的取值范围为:[ 1111 1111,0 ] ~ [ 0,0111 1111 ] ---> [ -127,127 ] ---> -2^7 ~ +2^7(首位是符号位,不参与实际的数据存储)实际一个自己的取值范围:[ -128,127 ] 为什么负数的取值区间多了一位呢?后面解释,慢慢来

原码是最容易理解和计算的表示方式。因为它正如字面意义,以二进制的形式表示数值的大小。

那么,为什么不直接使用原码就够了呢?还需要反码、补码这么麻烦。
这是因为,如果只使用原码进行计算会出现一些问题。例如计算:1-1=0,会变成什么样子呢?
请添加图片描述
这样的计算结果是错误的。所以,我们需要引入其他的编码方式:反码:在原码的基础上,符号位不变,其他位取反 —> (正数的反码不变,只改变负数)
请添加图片描述

因此,用反码计算,结果为 -0,而 0 没有正负之分。所以,这个结果不可取。所以,我们还需要引入其他的编码方式:补码:在反码的基础上 +1(符号位参与运算符,正数的补码就是原码)
请添加图片描述
补码的计算结果溢出了,最终为 1 0000 0000,由于八个位的存储空间有限,溢出的部分不可装进来了。最终,补码的计算结果为:1 + -1 = 0;这个计算结果才是正确的。所以,整数在计算机中,都是以补码的形式进行存储的。

请添加图片描述

上述问题:为什么一个字节的取值范围是 [ -128,127 ],而不是 [ -127,127 ]呢?
因为,反码中有一个 -0,数据中 0 就是 0,没有 +0 和 -0 的表示形式,因此,-0 被放在了最末一位存储了下来,规定了,用 -0 来表示 -128 占位,刚刚好,因此取值范围中 负数比正数多表示了一位。所以,一个字节的取值范围是:[ -128,127 ]

原码、反码、补码
       正数:原=反=补 三码合一
       负数:原码:二进制 
       	   	反码:原码符号位不变,其他位置取反 (0变1  1变0)
       	   	补码:反码 + 1(符号位参与运算符,正数的补码就是原码)
    因为计算机基本都只支持加法: ---> 所以计算机具有原码 反码 补码的概念
    		1 - 1 ---> 1 +(-1)  这个计算方式尤为重要,特别是在指针的运算过程中

例子:
	int a = 3892; 
    1. 分析: 3892 为正数 
            原码 : 人为分析:			  00000000 00000000 00001111 00110100
            反码 : 正数的反码 = 原码    00000000 00000000 00001111 00110100
            补码 : 正数的补码 = 反码    00000000 00000000 00001111 00110100
 	故 int a = 3892; 在 计算机中的 a 存储就是 补码: 00000000 00000000 00001111 00110100

    int b = -666;
    2. 分析: -666 为负数 
            原码 : 人为分析:                10000000 00000000 00000010 10011010
            反码 : 正数符号位不变,其他取反    11111111 11111111 11111101 01100101
            补码 : 反码 + 1                 11111111 11111111 11111101 01100110
    故 int b = -666; 在计算机中的 b 存储就是 补码: 11111111 11111111 11111101 01100110

我们都知道各种数据类型的取值范围:
请添加图片描述

我们这里拿 有符号短整型无符号短整型 举例说明。众所周知,int 的存储空间为4个字节大小,short的存储空间为2个字节大小,有符号短整型 取值范围是:-32768~32767;无符号短整型 取值范围是:0~65535,这个取值范围是如何计算得出的呢?
按照 上述 原码 反码 补码 的运算方式,在内存中,定义 short a;

请添加图片描述
其他的数据类型的取值范围同理。

以上。

我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!

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

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

相关文章

技术分享:A-23OH型树脂在汽车涂装废溶剂回收中的应用

在当今汽车制造业竞争激烈的环境下,提高生产效率、降低成本的同时,满足环保要求已成为各制造商追求的核心目标。水性涂料因其环保、节能等多重优势,在汽车涂装领域的应用日益广泛。然而,随之而来的喷涂废溶剂处理问题也日益凸显。…

2024年软件设计师中级(软考中级)详细笔记【7】面向对象技术(下)23种设计模式(分值10+)

目录 前言阅读前必看 第七章 面向对象技术(下)7.3 设计模式(固定4分)7.3.1 设计模式的要素7.3.2 创建型设计模式7.3.2.1 Abstract Factory(抽象工厂)7.3.2.2 Builder(生成器)7.3.2.3…

调整奇数偶数的顺序

//调整奇数偶数的顺序 //输入一个整数数组&#xff0c;实现一个函数 //使得数组中所有的奇数位于数组的前半部分&#xff0c;所有的偶数位于数组的后半部分 #include<stdio.h> void tz(int a[],int sz) {int i 0;int j 0;int q 0;int c[100] { 0 };int b[100] { 0 …

Qt第十三天:网络编程:TCP和UDP的使用

我发现了有些人喜欢静静看博客不聊天呐&#xff0c; 但是ta会点赞。 这样的人呢帅气低调有内涵&#xff0c; 美丽大方很优雅。 说的就是你&#xff0c; 不用再怀疑哦 ❤️TCP&#xff1a; 一、创建项目&#xff0c;命名为Server&#xff0c;继承QWidget 二、添加Qt设计师…

Axure重要元件三——中继器添加数据

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 本节课&#xff1a;中继器添加数据 课程内容&#xff1a;添加数据项、自动添加序号、自动添加数据汇总 应用场景&#xff1a;表单数据的添加 案例展示&#xff1a; 步骤…

算法: 模拟题目练习

文章目录 模拟替换所有的问号提莫攻击Z 字形变换外观数列数青蛙 总结 模拟 替换所有的问号 按照题目的要求写代码即可~ public String modifyString(String ss) {int n ss.length();if (n 1) {return "a";}char[] s ss.toCharArray();for (int i 0; i < n; i…

【华为HCIP实战课程十三】OSPF网络中3类LSA及区域间负载均衡,网络工程师

一、ABR SW1查看OSPF ABR为R4而非R3,因为R4连接骨干区域0,R3没有连接到区域0 R6查看OSPF路由: 二、查看3类LSA,由于R6不是ABR因此自身不会产生3类LSA 但是有区域间路由就可以看到3类LSA

分布式介绍

CAP理论 CAP理论是分布式架构中提出来的一种设计思想模型&#xff0c;全称是由Consistency、Availability、Partition Tolerance三个词组成。 C(Consistency&#xff0c;一致性):总能读到最新的写操作的结果A(Availability&#xff0c;可用性):每个请求都要在合理的时间内给出…

Spring Boot知识管理:跨平台集成方案

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

后渗透利用之vcenter

目录 vcenter介绍环境搭建历史漏洞版本信息1、直接访问2、请求接⼝ 打点CVE_2021_21972漏洞描述&#xff1a;POC&#xff1a; 后渗透获取vCenter后台重置密码Cookie登录创建管理员 获取虚拟机Hash分析快照挂载磁盘 获取Esxi 后台获取解密key获取数据库账号密码查询Esxi加密密码…

ESP32-IDF 分区表

目录 一、基本介绍1、配置结构体1.1 esp_partition_t1.2 esp_partition_iterator_t 2、常用 API2.1 esp_partition_find2.2 esp_partition_find_first2.3 esp_partition_get2.4 esp_partition_next2.5 esp_partition_iterator_release2.6 esp_partition_verify2.7 esp_partitio…

使用WPF写一个简单的开关控件

<Window x:Class"WPF练习.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expression/blend/2008"xm…

适用于 vue react Es6 jQuery 等等的组织架构图(组织结构图)

我这里找的是 OrgChart 插件; 地址: GitHub - dabeng/OrgChart: Its a simple and direct organization chart plugin. Anytime you want a tree-like chart, you can turn to OrgChart. 这里面能满足你对组织架构图的一切需求! ! ! 例: 按需加载 / 拖拽 / 编辑 / 自定义 / …

【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练

一、介绍 玉米病害识别系统&#xff0c;本系统使用Python作为主要开发语言&#xff0c;通过收集了8种常见的玉米叶部病害图片数据集&#xff08;‘矮花叶病’, ‘健康’, ‘灰斑病一般’, ‘灰斑病严重’, ‘锈病一般’, ‘锈病严重’, ‘叶斑病一般’, ‘叶斑病严重’&#x…

使用JMeter进行Spring Boot接口的压力测试

使用 Apache JMeter 对接口进行压力测试是一个相对简单的过程。以下是详细的步骤&#xff0c;包括安装、配置和执行测试计划。 1. 下载和安装 JMeter 下载 JMeter 从 JMeter 官方网站https://jmeter.apache.org/download_jmeter.cgi 下载最新版本的 JMeter。 解压缩 将下载的 …

【AIGC】ChatGPT与人类理解力的共鸣:人机交互中的心智理论(ToM)探索

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;心智理论(Theory of Mind,ToM)心智理论在心理学与神经科学中的重要性心智理论对理解同理心、道德判断和社交技能的重要性结论 &#x1f4af;乌得勒支大学研究对ChatGPT-4…

基于python+dj+mysql的音乐推荐系统网页设计

音乐网站开发 如果你在学Python&#xff0c;需相关的【配套资料工具】作为研究[doge][脱单doge] 可以后台✉私信up主&#xff0c;发送&#x1f449;关键词【音乐】 本章以音乐网站项目为例&#xff0c;介绍Django在实际项目开发中的应用&#xff0c;该网站共分为6个功能模块分…

使用开源的 Vue 移动端表单设计器创建表单

FcDesigner Vant 版是一款基于 Vue3.0 的移动端低代码可视化表单设计器工具&#xff0c;通过数据驱动表单渲染。可以通过拖拽的方式快速创建表单&#xff0c;提高开发者对表单的开发效率&#xff0c;节省开发者的时间。 源码下载 | 演示地址 | 帮助文档 本项目采用 Vue3.0 和 …

Elasticsearch基本使用及介绍

Elasticsearch 1. 关于各种数据库的使用 关于MySQL&#xff1a;是关系型数据库&#xff0c;能清楚的表示数据之间的关系&#xff0c;并且&#xff0c;是基于磁盘存储的&#xff0c;可以使用相对较低的成本存储大量的数据 关于Redis&#xff1a;是基于K-V结构的在内存中读写数…

屏蔽小米电视广告的方法

小米电视那个广告&#xff0c;太多&#xff0c;时间太长&#xff0c;影响观看感受&#xff0c;经过处理&#xff0c;成功屏蔽了小米电视的广告&#xff0c;提升了观影体验。 手动添加AD域名到 hosts 列表 小米(红米)电视关闭开机AD屏蔽hosts方法。 在路由器的hosts中配置。 …