数据在内存中的储存

简介: 数据在内存中的储存

c语言中数据在内存中都是以二进制储存的,但是不同的数据类型储存的方式也不一样,我们先简单了解一下整数和浮点数在内存中储存的方式。


1.整数在内存中的存储


整数的二进制有三种表示方法:原码反码补码。一般在内存中存的是补码

正数的原码,反码,补码都相同,

而负数的原码最高位是符号位,0表示正,1表示负,其他位用二进制来表示,

反码原码的符号位不变,其他位取反+1,得到反码

补码就是反码+1,


例如:-12

原码:10000000  00000000  00000000   00001100

反码:11111111    11111111     11111111     11110011

补码:11111111    11111111     11111111     11110100


2. 大小端字节序和字节序判断


了解了整数在内存中存储的方式,我们来看一道题,

# include <stdio.h>
int main ()
{
int a = 0x11223344 ;
char* p=&a;
*p = 0;
printf("%x ", a);
return 0 ;
}


a会变成什么呢?


       


为什么改变的时44呢?这就涉及到大小端字节序的储存方式了,

⼤端(存储)模式:是指数据的 低位字节 内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存 在内存的低地址处。

⼩端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存 在内存的⾼地址处。

低位字节和高位字节指的是权重,例如:



权重低的成称为低位字节,权重高的称为高位字节,

如何判断该字节序是大端储存还是小端储存呢?


int main()
{
    int a = 0x11223344;
    char* p = &a;
    *p = 0;
    if (*((char*)&a) == 0)
        printf("小端\n");
    else
        printf("大端\n");
    return 0;
}



 


3.浮点数在内存中的储存


浮点存的过程


知道整数的储存方式后,那么浮点数是怎么储存的呢?



例如:

十进制的 5.0 写成二进制是  101.0 ,也就是 1.01*2^2    (1<=M<2)

按上面的格式写就是:S=0,M=1.10,E=2  V=(-1)^0  *  1.01  *  2^2

内存中只储存S,M的小数部分,E

因为我们默认为M的整数部分为1,所以不去储存它,节省一位用来储存小数部分,使浮点数储存更精确。


IEEE 754规定:

对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M

对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M


画图示例:



对于指数 E来说,是一个无符号整数(unsigned int),如果E是八位,范围是0~255,如果E是11位,范围是0~2047,但是在科学计数法中E是可以为负数的,所以我们(IEEE什么协会)规定,存储E的值要加上127(如果是11位要加上1023),


比如E是10,必须保存为 10+127,那么储存在内存中的是10001001


窃窃私语:也不知道为啥这么麻烦


浮点取的过程


M取出来时,要记得加上整数部分的1,

指数E取出来有三种情况:E不全为0也不全为1 , E全为0,  E全为1,

E不全为0也不全为1:

这种情况比较简单,把E取出来减127(或者1023),

E全为0:这时E的真实值就是1-127(或者1-1023)表示无限接近0的值

E全为1:这时E的真实值就是E的值就非常大了,表示无穷大的值,正负取决于符号位S


学到这里,我们已经了解了浮点数的储存,浮点数有可能不是完全精确的储存在内存中,就是会有误差,因为把小数部分转化成二进制没办法完全精确。


4.结语


讲解的不是很详尽,有不对的地方或者哪里需要补充,请在评论区留言哦!

相关文章
|
16天前
|
监控 算法 应用服务中间件
“四两拨千斤” —— 1.2MB 数据如何吃掉 10GB 内存
一个特殊请求引发服务器内存用量暴涨进而导致进程 OOM 的惨案。
|
15天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
31 1
|
20天前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
22天前
|
监控 Java easyexcel
面试官:POI大量数据读取内存溢出?如何解决?
【10月更文挑战第14天】 在处理大量数据时,使用Apache POI库读取Excel文件可能会导致内存溢出的问题。这是因为POI在读取Excel文件时,会将整个文档加载到内存中,如果文件过大,就会消耗大量内存。以下是一些解决这一问题的策略:
54 1
|
25天前
|
缓存 安全 Java
使用 Java 内存模型解决多线程中的数据竞争问题
【10月更文挑战第11天】在 Java 多线程编程中,数据竞争是一个常见问题。通过使用 `synchronized` 关键字、`volatile` 关键字、原子类、显式锁、避免共享可变数据、合理设计数据结构、遵循线程安全原则和使用线程池等方法,可以有效解决数据竞争问题,确保程序的正确性和稳定性。
34 2
|
29天前
|
存储 编译器
数据在内存中的存储
数据在内存中的存储
37 4
|
30天前
|
存储 C语言
深入C语言内存:数据在内存中的存储
深入C语言内存:数据在内存中的存储
|
4月前
|
存储 分布式计算 Hadoop
HadoopCPU、内存、存储限制
【7月更文挑战第13天】
276 14
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
339 0
|
24天前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。