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

    文章

    7026

    浏览量

    89019
  • 编程
    +关注

    关注

    88

    文章

    3615

    浏览量

    93722
  • C++
    C++
    +关注

    关注

    22

    文章

    2108

    浏览量

    73642

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

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

收藏 人收藏

    评论

    相关推荐

    C++新手容易犯的十个编程错误

    简单的总结一下 C++ 新手容易犯的一些编程错误,给新人们提供一个参考。 1 有些关键字在 cpp 文件多写了 对于 C++ 类,一些关键字只要写在 .h 中就好,cpp 中就不用再
    的头像 发表于 11-15 12:42 348次阅读

    C语言和C++结构体的区别

    同样是结构体,看看在C语言和C++中有什么区别?
    的头像 发表于 10-30 15:11 217次阅读

    内存储器主要用来存储什么

    器的主要功能 数据存储内存储器用于存储CPU需要直接访问的数据,这些数据可能是程序代码、用户
    的头像 发表于 10-14 09:55 740次阅读

    使用OpenVINO GenAI API在C++构建AI应用程序

    许多桌面应用程序是使用 C++ 开发的,而将生成式AI(GenAI)功能集成到这些应用程序可能会很具有挑战性,尤其是因为使用像 Hugging Face 这样的 Python 库的复杂性。C++
    的头像 发表于 10-12 09:36 382次阅读
    使用OpenVINO GenAI API在<b class='flag-5'>C++</b><b class='flag-5'>中</b>构建AI应用程序

    ostream在c++的用法

    ostream 是 C++ 标准库中一个非常重要的类,它位于 头文件(实际上,更常见的是通过包含 头文件来间接包含 ,因为 包含了 和 )。 ostream 类及其派生类(如 std::cout
    的头像 发表于 09-20 15:11 709次阅读

    C++实现类似instanceof的方法

    函数,可实际上C++没有。但是别着急,其实C++中有两种简单的方法可以实现类似Java的instanceof的功能。 在 C++
    的头像 发表于 07-18 10:16 584次阅读
    <b class='flag-5'>C++</b><b class='flag-5'>中</b>实现类似instanceof的方法

    浅谈C语言内存分区和STM32存储器分配

    RAM是与CPU直接交换数据的内部存储器,也叫主存(内存)。 它可以随时读写,而且速度很快,通常作为操作系统或其他正在运行的程序的临时数据
    的头像 发表于 04-02 09:50 1324次阅读
    浅谈<b class='flag-5'>C</b>语言<b class='flag-5'>内存</b>分区和STM32<b class='flag-5'>存储</b>器分配

    使用 MISRA C++:2023® 避免基于范围的 for 循环中的错误

    在前两篇博客,我们 向您介绍了新的 MISRA C++ 标准 和 C++ 的历史 。在这篇博客,我们将仔细研究以 C++
    的头像 发表于 03-28 13:53 791次阅读
    使用 MISRA <b class='flag-5'>C++</b>:2023® 避免基于范围的 for 循环中的错误

    C语言内存泄漏问题原理

    内存泄漏问题只有在使用堆内存的时候才会出现,栈内存不存在内存泄漏问题,因为栈内存会自动分配和释放。C
    发表于 03-19 11:38 526次阅读
    <b class='flag-5'>C</b>语言<b class='flag-5'>内存</b>泄漏问题原理

    C程序可用的存储类有哪些?

    register 存储类用于定义存储在寄存器而不是 RAM 的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个词),且不能对它应用一元的 '&' 运
    发表于 03-15 12:32 379次阅读

    美国政府呼吁开发人员使用内存安全编程语言

    所谓内存安全,即是防止程序在处理内存时产生如缓冲区溢出以及悬停指针等潜在漏洞。因此,尽管Java凭借其内存安全模式,不受此类问题影响,但C及其变异体
    的头像 发表于 02-29 14:40 788次阅读

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

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

    c语言,c++,java,python区别

    C语言、C++、Java和Python是四种常见的编程语言,各有优点和特点。 C语言: C语言是一种面向过程的
    的头像 发表于 02-05 14:11 2387次阅读

    vb语言和c++语言的区别

    VB语言和C++语言是两种不同的编程语言,虽然它们都属于高级编程语言,但在设计和用途上有很多区别。下面将详细比较VB语言和C++语言的区别。 设计目标: VB语言(Visual Bas
    的头像 发表于 02-01 10:20 2311次阅读

    C++简史:C++是如何开始的

    的 MISRA C++:2023 博客系列的第二部分。 在这篇博客,我们将深入探讨 C++ 的历史、编程语言多年来的发展历程以及它的下一步发展方向。
    的头像 发表于 01-11 09:00 594次阅读
    <b class='flag-5'>C++</b>简史:<b class='flag-5'>C++</b>是如何开始的