0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++编程中整型数据在内存中存储是怎么样的

C语言编程基础 来源:C语言编程学习基地 作者:C语言编程 2021-09-01 15:22 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1.整型的归类

char

short

int

long

以上都分为有符号(signed)与无符号(unsigned)的类型

2.原码、反码和补码

2.1 定义

计算机在表示一个数字时,是采用二进制的方式,所以为了准确表示一个数的正负,每一个有符号数都将其最高位视作是符号位,最高位为0表示正数,最高位为1表示负数。我们接下来以有符号整型int的数字进行分析。

一个有符号整数由 符号位 + 数值位 组成,数值位是其最高位,分别以0/1表示正/负

对于正数来说,反码补码都与原码相同;

对于负数来说,符合以下3条规则:

原码:将十进制数字直接翻译为二进制数

反码:原码的符号位不变,其他位按位取反

补码:反码+1

而对于整型来说,整型在内存中实际上是以补码的形式进行存储的。

2.2 补码的意义

有的同学可能就会问了,为什么计算机要发展出原码、反码、补码这么多种码呢?

这就与计算机对于整数的运算有关了。

CPU只有加法器,减法在运算时也会被视作一个数加另一个负数。考虑到整数的最高位是符号位,两个整数中若包含负数,以原码直接相加得到的数一定是不对的。所以问题就变成了如何使得运算简单而精确,既要处理符号位,又要只进行加法运算,达到以某一种二进制形式的“码”直接相加就能得到正确结果。

下面,我们以60+(-18)为例,分别用原码、反码、补码直接进行二进制的运算。

原码运算:

00000000 00000000 00000000 00111100( 60的原码)+ 10000000 00000000 00000000 00010010(-18的原码)-------------------------------------------10000000 00000000 00000000 01001110(某个数的原码)

显然,得到了的原码转化为10进制是-78,并非正确答案42。

反码运算:

00000000 00000000 00000000 00111100( 60的反码)+ 11111111 11111111 11111111 11101101(-18的反码)-------------------------------------------100000000 00000000 00000000 00101001 截取后32位: 00000000 00000000 00000000 00101001(某个数的反码)

显然,得到了的反码转化为10进制原码是41,并非正确答案42,但是只与正确答案相差(+1),于是,我们就想将负数的反码+1,即变成“补码”来进行运算,而又正数的补码是原码本身,这时候我们看看会怎么样呢?

补码运算:

00000000 00000000 00000000 00111100( 60的补码)+ 11111111 11111111 11111111 11101110(-18的反码)-------------------------------------------100000000 00000000 00000000 00101010 截取后32位: 00000000 00000000 00000000 00101010(某个数的补码)

显然,得到了的补码转化为10进制原码是42,我们得到了正确结果。

2.3 结论

综上,我们发现,只要将两个整数使用补码进行运算,就不需要考虑它们的符号位了,将它们的所有位直接简单相加即可,就能得到正确的结果。

2.4* 负数二进制补码的快速转化

对于char类型整数,-1用二进制补码表示为

当我们已知一个负数的二进制补码时,用比这个数多一位的、最高位为1、其他位全0、这里应为9位的二进制数

直接减去-1的二进制补码得

得到的数就是十进制(-1)的绝对值,也就是1,只要加上负号,就能快速得到这个负数二进制补码的十进制原码。

原理十分简单,一个负数的 原码加上补码 = 原码+反码+1 = 所有二进制位全1再加1 = 多一位的、最高位为1、其他位全0

3. 大小端字节序

3.1 什么是大小端

在内存中,数据的大小端存储是在 字节 尺度上进行讨论的

大端存储模式:数据的 低位 保存在内存的 高地址 ,数据的 高位 保存在内存的 低地址

小端存储模式:数据的 低位 保存在内存的 低地址 ,数据的 高位 保存在内存的 高地址

3.2 为什么有大端和小端之分

在计算机系统中,我们通常是以字节为单位存储数据的,每个地址对应一个字节。

一个字节为8bit,但是在C语言中除了8bit的char之外,还有16bit的short,32bit的int。另外,对于位数大于8位的处理器,例如16位和32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着如何将多个字节安排的问题。这边导致了大小端存储模式的诞生。

我们以int类型的数 0x01ff4218 为例(两个十六进制位即为1个字节),看一下在大小端下这4个字节分别是如何分配的

3.3 写一段代码来判断你的机器的大小端字节序

算法简单概括:截取4个字节大小的int整型的1个字节的低位。若机器为大端字节序,该字节存储0x00;若机器为小端字节序,该字节存储0x01;

#include《stdio.h》//实现方法1int check1(){ int i = 1; return *(char*)&i;}

//实现方法2int check2(){ union check { int i; char c; }ch = {1}; return ch.c;}

int main(){ int ret = check1(); if (ret == 1) { printf(“小端

”); } else { printf(“大端

”); } return 0;}

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    7315

    浏览量

    93986
  • 编程
    +关注

    关注

    90

    文章

    3708

    浏览量

    96765
  • C++
    C++
    +关注

    关注

    22

    文章

    2122

    浏览量

    76714

原文标题:C/C++编程知识:整型数据在内存中的存储!讲解+示例

文章出处:【微信号:xx-cyy,微信公众号:C语言编程基础】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C++程序异常的处理机制

    1、什么是异常处理? 有经验的朋友应该知道,在正常的CC++编程过程难免会碰到程序不按照原本设计运行的情况。 最常见的有除法分母为零,数组越界,
    发表于 12-02 07:12

    C/C++代码静态测试工具Perforce QAC 2025.3的新特性

     Perforce Validate  QAC 项目的相对/根路径的支持。C++ 分析也得到了增强,增加了用于检测 C++ 并发问题的新检查,并改进了实体名称和实
    的头像 发表于 10-13 18:11 346次阅读
    <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>代码静态测试工具Perforce QAC 2025.3的新特性

    技能+1!如何在树莓派上使用C++控制GPIO?

    和PiGPIO等库,C++可用于编程控制树莓派的GPIO引脚。它提供了更好的性能和控制能力,非常适合对速度和精度要求较高的硬件项目。在树莓派社区,关于“Python
    的头像 发表于 08-06 15:33 3582次阅读
    技能+1!如何在树莓派上使用<b class='flag-5'>C++</b>控制GPIO?

    如何使用闪存来保存 CYBT-343026 的数组等数据

    您好,我正在尝试使用 CYBT-343026 构建一块电路板。 我想将数据存储在一个简单的数组。T 即使断电,数据也应该保留。我可以使用EEPROM,但由于
    发表于 06-25 06:33

    在OpenVINO™ C++代码启用 AddressSanitizer 时的内存泄漏怎么解决?

    在 OpenVINO™ C++代码启用 AddressSanitizer 时遇到内存泄漏: \"#0 0xaaaab8558370 in operator new(unsigned
    发表于 06-23 07:16

    《ESP32S3 Arduino开发指南》第三章 C/C++语言基础

    3.9 循环结构 3.1 数据类型在C/C++语言程序,对所有数据都必须指定其数据类型。
    发表于 06-10 09:20

    划片机在存储芯片制造的应用

    划片机(DicingSaw)在半导体制造主要用于将晶圆切割成单个芯片(Die),这一过程在内存储存卡(如NAND闪存芯片、SSD、SD卡等)的生产中至关重要。以下是划片机在存储芯片制造
    的头像 发表于 06-03 18:11 745次阅读
    划片机在<b class='flag-5'>存储</b>芯片制造<b class='flag-5'>中</b>的应用

    主流的 MCU 开发语言为什么是 C 而不是 C++

    在单片机的地界儿里,C语言稳坐中军帐,C++想分杯羹?难喽。咱电子工程师天天跟那针尖大的内存空间较劲,C++那些花里胡哨的玩意儿,在这儿真玩不转。先说
    的头像 发表于 05-21 10:33 779次阅读
    主流的 MCU 开发语言为什么是 <b class='flag-5'>C</b> 而不是 <b class='flag-5'>C++</b>?

    C++学到什么程度可以找工作?

    C++学到什么程度可以找工作?要使用C++找到工作,特别是作为软件开发人员或相关职位,通常需要掌握以下几个方面: 1. **语言基础**:你需要对C++的核心概念有扎实的理解,包括但不限于指针、
    发表于 03-13 10:19

    创建了用于OpenVINO™推理的自定义C++和Python代码,从C++代码获得的结果与Python代码不同是为什么?

    创建了用于OpenVINO™推理的自定义 C++ 和 Python* 代码。 在两个推理过程中使用相同的图像和模型。 从 C++ 代码获得的结果与 Python* 代码不同。
    发表于 03-06 06:22

    RTOS的本地存储指针使用

    本地存储指针是RTOS的一个重要特性,增强了任务管理和数据处理能力。在RTOS上下文中,本地存储是指存储在本地的特定任务或对象的
    的头像 发表于 02-28 16:33 1171次阅读
    RTOS<b class='flag-5'>中</b>的本地<b class='flag-5'>存储</b>指针使用

    labview数据类型与PLC 数据类型之间的转换(来自于写入浮点数到汇川 PLC数据转换关键的修改)

    为32位无符号整型U32 2、将U32拆分为两个U16,分高低位写入PLC 3、在PLC,将低位寄存器设置为浮点数数据类型 4、结果:PLC中一直无法正确转换。 原因及解决方法: 1、labview
    发表于 02-24 19:01

    Spire.XLS for C++组件说明

    Spire.XLS for C++ 是一款专业的 C++ Excel 组件,可以用在各种 C++ 框架和应用程序。Spire.XLS for C+
    的头像 发表于 01-14 09:40 1297次阅读
    Spire.XLS for <b class='flag-5'>C++</b>组件说明

    EE-132:使用VisualDSP将C代码和数据模块放入SHARC存储

    电子发烧友网站提供《EE-132:使用VisualDSP将C代码和数据模块放入SHARC存储.pdf》资料免费下载
    发表于 01-07 13:55 0次下载
    EE-132:使用VisualDSP将<b class='flag-5'>C</b>代码和<b class='flag-5'>数据</b>模块放入SHARC<b class='flag-5'>存储</b>器<b class='flag-5'>中</b>

    EE-112:模拟C++的类实现

    电子发烧友网站提供《EE-112:模拟C++的类实现.pdf》资料免费下载
    发表于 01-03 15:15 0次下载
    EE-112:模拟<b class='flag-5'>C++</b><b class='flag-5'>中</b>的类实现