【C语言】原码 反码 补码

ops/2024/10/20 9:01:13/
为什么要有原码 反码 补码的概念?

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

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

任何的数值,都会有拥有其对应的二进制格式 正数: 1  ---> 0| 000 0000 0000 0001 2  ---> 0| 000 0000 0000 00103  ---> 0| 000 0000 0000 0010负数: -1 ---> 1| 000 0000 0000 0001  --->最高位:1 --> 因为第一位是符号位,表示数值的正负,这里是:负数 或者,有另外一种术语:*将带符号位的机器数对应的真正数值*称为*机器数的真值*。0000 0001 的真值= +000 0001 = +11000 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 00110100int 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.ppmy.cn/ops/126935.html

相关文章

外部服务器如何访问专用网络的本地IP

在专用网络(如公司内网、专用局域网等)中的 IP 地址,也属于本地 IP 地址。这些地址仅在专用网络内部使用,不能直接从互联网访问。本地 IP 地址的范围通常包括以下几类私有地址段: 10.0.0.0 到 10.255.255.255172.16.0…

RabbitMQ 发布确认模式

RabbitMQ 发布确认模式 一、原理 RabbitMQ 的发布确认模式(Publisher Confirms)是一种机制,用于确保消息在被 RabbitMQ 服务器成功接收后,发布者能够获得确认。这一机制在高可用性和可靠性场景下尤为重要,能够有效防止…

南昌近视手术医生排名更新,速速围观!

在南昌,哪些医生做近视手术好呢?小编已经为大家整理出来啦!下文的这些医生均是小编根据多年的从业经验、口碑评价,筛选和整理出来的TOP级医生们!南昌近视手术医生排名已更新,赶紧来看看都有谁吧&#xff01…

Python项目Docker服务器部署

Python项目Docker服务器部署 Python项目Docker服务器部署准备工作部署其他问题 Python项目Docker服务器部署 准备工作 1.准备基础镜像 # 指定拉取arm架构镜像 docker pull --platform linux/arm64 python:3.11 # 指定拉取amd架构镜像 docker pull --platform linux/amd64 py…

联系拯救者Y9000P2022笔记本电脑进入BIOS快捷键

联系拯救者Y9000P2022笔记本电脑进入BIOS快捷键 文章目录 联系拯救者Y9000P2022笔记本电脑进入BIOS快捷键1. 进入BIOS快捷键2. 快速进入BIOS设置界面3. 快速进入启动项选择界面 1. 进入BIOS快捷键 进入BIOS设置界面的快捷键为F2快速进入启动项选择界面的快捷键为F12 2. 快速进…

【数据分享】全国科技-高技术产业新产品开发情况(2011-2021年)

数据介绍 一级标题指标名称单位科技高技术产业新产品开发项目数个科技医药制造业高技术产业新产品开发项目数个科技化学药品制造高技术产业新产品开发项目数个科技中成药制造高技术产业新产品开发项目数个科技生物、生化制品的制造高技术产业新产品开发项目数个科技航空航天器…

Java基于SSM微信小程序物流仓库管理系统设计与实现(源码+lw+数据库+讲解等)

选题背景 随着社会的发展,社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个…

沈阳乐晟睿浩科技有限公司抖音小店新篇章

在数字经济浪潮席卷全球的今天,电子商务行业迎来了前所未有的发展机遇。尤其是以抖音为代表的短视频直播平台,更是开辟了电商营销的新蓝海。在这场变革中,沈阳乐晟睿浩科技有限公司凭借其敏锐的市场洞察力、强大的技术实力和深厚的行业积累&a…