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

    文章

    6511

    浏览量

    87600
  • 编程
    +关注

    关注

    88

    文章

    3440

    浏览量

    92388
  • C++
    C++
    +关注

    关注

    21

    文章

    2066

    浏览量

    72900

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

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

收藏 人收藏

    评论

    相关推荐

    数组和链表在内存中的区别 数组和链表的优缺点

    数组和链表在内存中的区别 数组和链表的优缺点  数组和链表是常见的数据结构,用于组织和存储数据。它们在内存中的
    的头像 发表于 02-21 11:30 263次阅读

    c语言整型数据的溢出计算

    计算原理,介绍其风险及可能带来的后果,并提供一些应对策略和措施,旨在帮助程序员理解溢出问题并提供有效的解决方案。 一、溢出计算原理 1.1 数据类型与范围 C语言中的整型数据类型包括char、short、int、long等,它们
    的头像 发表于 11-30 11:45 863次阅读

    java中长整型怎么定义

    在Java中,长整型是一种数据类型,用于存储整数值。它的取值范围比整型要大,可以存储更大的整数值。长整型
    的头像 发表于 11-30 11:29 1784次阅读

    Linux C/C++编程中的内存泄漏问题

    ,需要对各种编程语言和技术有深入的理解。而C++,作为一种高性能的编程语言,在许多领域(如网络编程、嵌入式系统、音视频处理等)都发挥着不可忽视的作用。然而,许多
    的头像 发表于 11-09 10:11 388次阅读
    Linux C/<b class='flag-5'>C++</b><b class='flag-5'>编程</b>中的<b class='flag-5'>内存</b>泄漏问题

    单片机编程语言可以用c++吗?

    单片机编程语言可以用c++吗?
    发表于 11-09 06:40

    数据在内存存储右对齐是在什么情况下使用?

    数据在内存存储右对齐是在什么情况下使用
    发表于 10-15 11:20

    高质量CC++编程指南

    林锐-高质量CC++编程指南电子档
    发表于 10-07 07:14

    嵌入式C/C++语言精华文章集锦

    /C++编程,我们经常要传送的不是简单的字节流(char型数组),而是多种数据组合起来的一个整体,其表现形式是一个结构体。 经验不足的开发人员往往将所有需要传送的内容依顺序保存在 c
    发表于 09-25 08:00

    如何管理STM32产品内存保护单元(MPU)

    本应用笔记介绍如何管理 STM32 产品内存保护单元(MPU)。MPU 是用于存储器保护的可选组件。STM32 微控制器(MCU)嵌入 MPU 之后变得更稳健可靠。在使用 MPU
    发表于 09-07 06:23

    使用NUC505内部代码来播放存储在内部SPI闪光的WAV文件

    应用程序: WAV 播放器演示,使用内部编码器播放存储在内部 SPI 闪光的 WAV 文件 BSP 版本: NUC505系列 BSP CMSIS V3.02.000 硬件
    发表于 08-23 08:24

    小数在内存中是如何存储的?为什么C语言中的浮点数不支持位移操作?

    小数在内存中是如何存储的?为什么C语言中的浮点数不支持位移操作?
    发表于 08-16 09:24 665次阅读
    小数<b class='flag-5'>在内存</b>中是如何<b class='flag-5'>存储</b>的?为什么C语言中的浮点数不支持位移操作?

    C++演示的推理速度比Python演示的推理速度更快是为什么?

    在同一主机机上采用相同型号的 Ran Object Detection C++ 演示 和 对象检测 Python 演示 。 C++ 演示的推理速度比 Python 演示的推理速度
    发表于 08-15 06:52

    如何在使用Inspector运行OpenVINO C++样本时避免内存泄露?

    运行OpenVINO™ 图像分类 Async C++示例带英特尔® Inspector用于检查内存问题。使用命令: $ pwd /home/centos
    发表于 08-15 06:18

    106进制04 变量在内存存储细节

    编程函数代码
    充八万
    发布于 :2023年07月26日 05:48:11

    EIM和内存问题之间的SDMA传输,传输完后查看rbuf数据,读取数据错误的原因?

    (mxc_sdma_memcopy_test)。(见附件)现在我可以从 FPGA 捕获 EIM 接口上的信号。时间基本上是我的预期。 现在我有两个问题: 1、用SDMA在内存和EIM之间传输数据时,每
    发表于 05-29 06:00