首页 > 系统相关 >c语言之正负整数在内存中的存储本质

c语言之正负整数在内存中的存储本质

时间:2024-10-26 22:47:31浏览次数:10  
标签:存储 字节 0010 二进制 int 正负 内存 bit

int、short、long、long long是如何定义变量的

        我们先从最为我们所知的定义变量入手,当我们用int定义一个变量的时候,这个变量是整型,长度是4个字节,不同的操作系统下由int定义的变量长度有可能不同,当然对于short、long、long long也是同样如此,因此为了使大家更清晰的了解本文内容,减少一些无关的疑问,我们有必要事先声明一下由这四个关键字,所定义的变量长度各自是多少。我用的是vs2019下的32位模式,如下图所示:

即:

关键字变量的长度(字节)变量的长度(bit位)
int432
short216
long432
long long864

        不难知道,int a = 15表示:

  1. a是用int定义的变量,它的类型是整型
  2. a的值是15

        接下来,我们看看int定义长度为4的整型变量的过程是什么样的?

       我们用红色框所框起来的绿色区域,表示计算机内的整个内存区域,橙色表示由int a = 15所定义的变量,在内存中所占的区域。每个格子表示一个字节。当然了此图中红色框内的格子只有50个,内存不可能只有50个字节,这只是一种简化的表示。

        int  a = 15,实际上就是在整个内存区域中,划取一块长度为4个字节的连续区域,用来存放数字15,这段连续的区域名字是a。则short b = 14,实际上就是在整个内存区域中,划取一块长度为2个字节的连续区域,用来存放数字14,这段区域的名字是b。同理long和long long都是此原理。

     可是计算机不是只认识二进制吗?15和14都是十进制的数啊,作为十进制数的15和14在内存中究竟是如何储存的呢?

        其实岂止这一个问题,我们在心里肯定会想,既然计算机只认识二进制,那么我们的眼睛在显示屏幕上看到的十进制数15和14,又是怎么回事?停!停!停!我们的文章标题是:正负整数在内存中的存储本质,怎么扯到这里来了?!我要告诉大家的是,我们的眼睛在显示屏幕上看到的十进制数15和14是怎么回事,是与本文要研究的正负整数在内存中的存储本质,并不相关的一件事。然而对于初学者来说(初学者包括我),不解决我们的眼睛在显示屏幕上看到的十进制数15和14是怎么回事这个问题,它总会在我们思考其它问题的时候,给我们制造麻烦,尤其是思考本文研究的问题。别怕,在后文中我们会轻松的解决这件事。

        注意此时我们知道了,int、short、long、long long是通过在内存中划取一块相应长度的区域来定义变量,这块区域的名字是变量名,这块区域中存放的数字就是变量的值。我们的疑问是,这个数字在这块内存中是如何储存的?我们通过回答以下几个问题,来一步步明晰并解决数字在内存中如何储存这件事。

        这几个问题分别是:

  1. 计算机为什么只认识二进制
  2. 内存的由来
  3. 位、字节的由来
  4. 1byte = 8bit原因是什么

计算机为什么只认识二进制?

        要搞清计算机为什么只认识二进制,我们大可不必把电脑的每个部件都拆下来,在显微镜里搞清楚每一个细节(当然作为初学者的我压根也没有这个能力)。也许,我们可以停下来,简单的想一下:二进制只有0和1,如果我没记错的话,在初中的物理课本中关于电学的某一个章节中,物理老师赋予了1和0两个不同的意义,它们是:

  • 1表示开关闭合,即通电状态
  • 0表示开关断开,即未通电状态

        喔或!如果现在我说,计算机连0和1都不认识,它只能被动感受通电和未通电,大家应该可以理解。通电和未通电本身就是一种信息,这种信息只有两个情况:

  • 一个情况是通电,我们用数字1表示
  • 一个情况是断电,我们用数字0表示

        至此,我们终于明白了计算机为什么只认识二进制,或者说为什么只认识0和1了吧!

内存的由来

        那么计算机如何表示数字2的呢?

        如果让你来设计计算机,你有什么好方法让只能感受通电和未通电的计算机来表示数字2呢?或者换句话说,你有什么好办法让本质上只认识0和1的计算机来认识数字2呢?

        要想达到自己能够想办法来让计算机认识2的地步,你需要先了解以下,计算机如何来储存0和1。注意现在是,你已经明白了计算机如何认识或者说如何表示0和1,尚不知道计算机如何储存0和1?。

        我不想一上来就介绍内存,cpu寄存器等之类的东西,然后告诉你,这些器件可以用来储存信息,亦或是做些别的事。因为,我们初学者大多数对于内存的理解,或者对于cpu的理解,仅仅限于听说过名字,眼睛看见过外观。这会让我们对其产生神秘感,进而给我们制造麻烦。所以请你先忘掉你仅仅只是了解皮毛,实则根本不懂的这些东西,不要让它影响了我们的思路。

        那么你能试想一下,什么东西来储存0和1吗?

        大概是一块能感受通电和断电的东西,如果想要表示1,就让这块东西通电好了;如果想要表示0就让这块东西断电好了;如果想要表示两个1,就搞两块这个东西,让这两块东西都通电好了;如果想要表示100个1就搞100块这个东西,让这100块东西都通电好了;如果想要表示100个1和100个0,就搞200个这东西,让100块通电,100块断电得了。然后我们把这块东西做的体积非常小,然后做很多很多个这种东西,最后把很多很多个这东西集成到一起,专门用来储存数据。通过图,我们来更直观的感受一下:如下图所示

      每一个蓝色的格子就表示一块这种东西,红色框框住的区域表示很多个一块一块的这种东西集成到一起。我们把很多很多由这块东西个集成到一起组成的那个大东西,就叫做内存。你如果想要买这块大东西,你可以买那个叫做内存条的东西。

位、字节的由来

        每一个蓝色格子所表示的那个仅能表示1个0或者1个1的小块东西,就是内存的最小存储单元。

        假如你面前有一只羊,我问你羊的数量,你会回答:一只羊。

        假如你面前有一条狗,我问你狗的数量,你会回答:一条狗

        假如你面前有一块这个小东西,我问你这块小东西的数量,你应该回答:

        1个位,英文表示为:1个bit

        bit是什么意思?

  1. bit你可以认为就是那块小东西的名字
  2. 10个bit想给我们的传达的信息是:可以容纳10个二进制数字,就是说可以容纳的0和1的总数量是10个
  3. 想必你已经明白了我们用N个bit来表示,可以容纳的二进制信息的数量

        这就是位(bit)的由来

       一个鸡蛋50g,二十个鸡蛋的重量是1000g,也就是1kg

        8个bit,也就是1字节(byte)。

        即1byte = 8bit

        1KB = 1024Byte

        1MB = 1024KB

        1GB = 1024MB

        请耐心,本文的内核来了!

        直接1kb = 1024bit不就得了,干嘛非要来个1byte = 8bit,然后1KB=1024Byte呢?

我们通常说的用来1MB的流量,指的就是用了1M个字节的流量,而不是1MBit。为什么bit最小的存储单元,而计算机中的基本存储单位却是byte(字节)呢?

 1byte = 8bit原因是什么?(文章内核)

        先看一下计算机如何来表示数字2?

        我们知道,十进制的数字2,就是二进制的10,请看下表

十进制数字对应的二进制数字
00
11
210
311
4100
5101
6110
7111
81000
91001
101010
111011
121100

        既然2的二进制是10,那我们用两个bit,就是说用两个小块东西,一个放1,另一个放0不就可以表示了吗?从这里开始,我们不再提小块东西,而直接把它们叫做bit。

short、int等用来定义变量的原因

        如果用两个bit,一个放1,一个放0来表示数字2,,那么如果我想表示1个苹果的个数1和0个香蕉的个数0时该怎么办呢?也是用两个bit,一个放苹果的个数1,另一个放香蕉的个数0吗?这样一来,10到底是1和0呢,还是表示2呢?

        请看下图:

        

        你很容易就看出来,三位数345,和个位数3、4、5了。我们把8个bit位看成一个整体,也就是1个byte字节。那么数字1,就是0000 0001,数字0,就是0000 0000。十进制2的二进制是10,如果一个bit位,就是单独的,与别的bit位不发生任何联系,那么二进制10就是1个1和1个0;如果把两个二进制位看做一个整体,10就是表示2;如果把三个二进制位看做一个整体,10会以010的方式呈现,此时还是表示2;如果把四个二进制位看做一个整体,此时还是表示2。

        二进制1111 1111 表示十进制的255,是一个字节所能表示的最大的数字,而十进制300的二进制是1 0010 1100需要9个bit位,该如何表示呢?

        不存在把9个bit位看做一个整体,计算机的最小存储单位是bit,而基本存储单位是byte字节。也就是说要想存储一个数,你要么用1个字节长度去存储,要么2两个字节长度去存储,要么用4个字节去存储等。用两个字节长度去存储,就是把16个二进制位看做一个整体,用4个字节长度去存储,就是把32个bit位看做是一个整体。于是300需要用2个字节去存储,二进制表示为:0000 0001 0010 1100。

        通过两个例子,我们来强化理解一下这个思想。

例子一:

         0010 0011 0010 0000  0010 0010 0010 0010        如何看待这个32位的数?

        如果是short定义的变量,则需要定义两个变量才能达到32位,则一个变量值是前16位:  0010 0011 0010 0000(二进制),即十进制8992;另一个变量值是后16位:0010 0010 0010 0010 (二进制),即十进制8738。

        如果是int定义的变量,则这个32位数整体就是变量值,即十进制589308450。

例子二:

        20位数 1010 1111 0000 0000 1111如何放到内存中?

        很简单 用int定义一个变量,把这个20位数赋给这个变量就可以了。然后这个变量就会在内存中划取一块长度为4个字节,即32bit位的空间,把这个20位的二进制数放入内存。它将会长这个样子:0000 0000 0000 1010 1111 0000 0000 1111。这个32个bit位,就是一个整体区域,要整体的看待。

        这就是为什么有了字节,为什么有了short、int、long等来定义数据。 

写的太累了,不想写了      

标签:存储,字节,0010,二进制,int,正负,内存,bit
From: https://blog.csdn.net/2301_81570594/article/details/143252857

相关文章

  • 数据在内存中的储存
    今天我们来深入了解一下各项数据在内存中的存储一.整数在内存中的存储这个众所的周知昂,咱们之前在讲解操作符的时候提到过一嘴,整数在内存中的存储形式——那就是以二进制的形式储存,记不清也没关系,很简单,咱们今天一起来回顾一下:整数的二进制表现形式有三种:原码、反码、补码......
  • C++ (7) 内存管理:掌握魔法能量的流动
    内存管理:掌握魔法能量的流动在C++的魔法世界中,内存管理是一项至关重要的技能。它涉及到程序如何分配和释放内存资源。如果处理不当,可能会导致程序崩溃或内存泄漏,就像一个魔法师失去了对魔法能量的控制。现在,让我们学习如何成为一个负责任的魔法师,掌握内存管理的艺术。6.......
  • 动态内存管理详解
    目录1.为什么要有动态内存分配2.malloc和free2.1malloc2.2free3.calloc和realloc3.1calloc3.2realloc4.常⻅的动态内存的错误4.1对NULL指针的解引⽤操作4.2对动态开辟空间的越界访问4.3对⾮动态开辟内存使⽤free释放4.4使⽤free释放⼀块动态开辟内存的......
  • 数据在内存中的存储
    目录1.整数在内存中的存储2.⼤⼩端字节序和字节序判断2.1什么是⼤⼩端?2.2为什么有⼤⼩端?2.3练习3.浮点数在内存中的存储3.1练习3.2浮点数的存储3.2.1浮点数存的过程3.2.2浮点数取的过程3.3题⽬解析1.整数在内存中的存储整数的2进制表⽰⽅法有三种,......
  • GESP一级真题分析-202303-选择题1-输入输出设备、存储单位、默认数据类型、标识符命名
    GESP一级真题分析-202303-选择题1-输入输出设备、存储单位、默认数据类型、标识符命名PDF文档公众号回复关键字:202410261相关知识点1)输入输出设备输入设备是外界向计算机传送信息的装置。在微型计算机系统中,最常用的输入设备是键盘和鼠标。此外还有电子光笔、数字化......
  • Java EasyExcel 导出报内存溢出的原因与解决方案
    JavaEasyExcel导出报内存溢出的原因与解决方案在现代企业级应用开发中,数据导出功能是一项常见且重要的任务。随着数据量的不断增长,如何高效、稳定地完成数据导出成为开发者面临的一大挑战。EasyExcel是阿里巴巴开源的一款基于Java的Excel处理工具,它以其高效、简洁的特性,广泛......
  • C语言:动态内存管理
    目录为什么要有动态内存管理mallocfreecallocrealloc为什么要有动态内存管理内存分为栈区、堆区、静态区,每个区存放的变量如下图:目前我们掌握的内存开辟方法有:创建结构体structs{inti;intc;};创建一些变量:intx;intu[10];charl;还有创建联合等…......
  • 【expo 库】expo-secure-store 安全存储库
    expo-secure-store是一个用于在移动应用程序中安全存储敏感数据的库。它提供了一组简单的API,使开发人员可以轻松地存储和检索敏感数据,如用户凭据、令牌和其他机密信息。这个库是Expo框架的一部分,Expo是一个开源平台,用于构建、部署和发布原生移动应用程序。在底层实现上,expo-se......
  • 读数据工程之道:设计和构建健壮的数据系统20数据工程存储抽象
    1. 数据工程存储抽象1.1. 数据工程存储抽象是数据组织和查询模式,位于数据工程生命周期的核心,建立在之前讨论的数据存储系统之上1.2. 关键的考虑1.2.1. 目的和用例1.2.1.1. 必须首先确定存储数据的目的1.2.2. 更新模式1.2.2.1. 是否针对批量更新、流式插入或......
  • 虚拟内存有什么用
    虚拟内存的应用主要包括以下几个方面:一、程序运行;二、内存扩展;三、内存保护;四、内存共享;五、程序移植;六、提升性能;七、硬件和操作系统的兼容性。虚拟内存是一种使得计算机系统看起来具有更大内存的技术,通过硬盘来扩充内存容量。一、程序运行虚拟内存允许程序在没有全部载入物......