数据在内存中的存储

本文转自https://blog.csdn.net/mathlian9/article/details/81033794 

首先认识一下计算机存储结构:

 

寄存器:中央处理器CPU的一部分,空间比较小在kb级别,用来暂存指令,数据和地址。CPU在处理数据时往往先把数据取存到寄存器中,然后再做处理,这样可以加快直接从内存中读取指令和数据。

高速缓存区:内存与CPU之间的存储器,容量比较小在MB级别,但是速度比内存高的多(比寄存器要慢一倍左右),接近于CPU的速度,它是加速读取速度的一个桥梁, CPU在内存中读取数据时首先查询缓存区是否有对应的数据,如果有则直接读取,没有的话在村内存中读取,在缓存区中存储的数据都是内存中存储数据。
*系统会自动管理缓存中的数据,如果某个数据访问频率降低到一定的值,那么就从缓存区中移除,从而将在内存中访问频率较高的数据放入缓存区中。

内存:是计算机运行过程中的存储主力,用于存储指令(编译好的代码段),运行中的各个静态,动态,临时变量,外部文件的指针等等。计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大,用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据,CPU会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来,内存的运行也决定了计算机的稳定运行。
*举例:如果内存大小是4G,一个程序装入内存需要大于4G空间的话,该程序是无法运行的,当然实际是还要去掉操作系统占用的内存,因此连4G都无法满足的。(当然现在有了虚拟内存,也就是将硬盘的一部分映射为内存空间,将不经常访问的指令放到虚拟内存中,这样其实是支持大于4G的程序的,这里只是在假设没有虚拟内存的情况下的举例说明)。

硬盘:硬盘的空间大,一般用于存储永久性的文件。

整型在内存中存储:
    原码:直接将二进制按照正负数的形式翻译成二进制就可以。
    反码:符号位不变,其他位次按位取反。
    补码:反码+1。
   *正数的原码、反码、补码都相同。
    整型在内存中的存放的是补码。
为什么是补码?
    在计算机中,数值一律用补码来表示和存储,因为使用补码可以将符号位和数值统一处理。同时,加法和减法也可以统一处理,补码和原码可以相互转化,其运算过程是相同的,不需要额外的硬件电路。

大小端的存储:
    大端存储:是指数据的低位保存在内存的高地址中,而数据高位保存在内存的低地址中。
    小端存储:是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。
计算机有大小端存储的原因:
    对于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题,因此就导致了大端、小端存储模式。

浮点数在内存中存储:
    首先浮点数家族包括:float、 double、 long double。
    根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V可以表示成下面形式:
            (-1)^S*M*2^E
    其中(-1)^S表示符号位,当S=0时,V为正数;当S=1时,V为负数。M表示有效数字,大于1小于2。2^E表示指数位。

举个例子:对于5.0,写成二进制是101.0,相当于1.01*2^2。
对于-5.0,写成二进制是-101.0,相当于-1.01*2^2

IEEE规定:

    

c/c++中内存分配
    1.栈区:由编译器自动释放,存放运行函数而分配的局部变量、函数参数、返回数据、返回的地址。
    2.堆区:由程序员分配释放,如果程序员不释放,结束程序后时,可能由OS回收。分配方式类似链表。
    3.全局区(静态区):存放全局变量、静态数据、常量。程序结束后由系统自动释放。
    4.文字常量区:常量字符串就存放在这里,程序结束后由系统释放。
    5.程序代码区:存放函数体(类成员函数和全局函数)的二进制代码。

内存分配方式的三种:
    1.从静态存储区分配
    2.在栈上创建
    3.从堆上分配
 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值