数据在内存中的储存

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

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.结语


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

相关文章
|
4月前
|
消息中间件 存储 缓存
kafka 的数据是放在磁盘上还是内存上,为什么速度会快?
Kafka的数据存储机制通过将数据同时写入磁盘和内存,确保高吞吐量与持久性。其日志文件按主题和分区组织,使用预写日志(WAL)保证数据持久性,并借助操作系统的页缓存加速读取。Kafka采用顺序I/O、零拷贝技术和批量处理优化性能,支持分区分段以实现并行处理。示例代码展示了如何使用KafkaProducer发送消息。
|
7月前
|
缓存 安全 Java
使用 Java 内存模型解决多线程中的数据竞争问题
【10月更文挑战第11天】在 Java 多线程编程中,数据竞争是一个常见问题。通过使用 `synchronized` 关键字、`volatile` 关键字、原子类、显式锁、避免共享可变数据、合理设计数据结构、遵循线程安全原则和使用线程池等方法,可以有效解决数据竞争问题,确保程序的正确性和稳定性。
207 57
|
6月前
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
188 12
|
7月前
|
监控 算法 应用服务中间件
“四两拨千斤” —— 1.2MB 数据如何吃掉 10GB 内存
一个特殊请求引发服务器内存用量暴涨进而导致进程 OOM 的惨案。
156 14
|
7月前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
377 1
|
7月前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
7月前
|
监控 Java easyexcel
面试官:POI大量数据读取内存溢出?如何解决?
【10月更文挑战第14天】 在处理大量数据时,使用Apache POI库读取Excel文件可能会导致内存溢出的问题。这是因为POI在读取Excel文件时,会将整个文档加载到内存中,如果文件过大,就会消耗大量内存。以下是一些解决这一问题的策略:
913 1
|
23天前
|
Arthas 监控 Java
Arthas memory(查看 JVM 内存信息)
Arthas memory(查看 JVM 内存信息)
62 6
|
2月前
|
存储 缓存 算法
JVM简介—1.Java内存区域
本文详细介绍了Java虚拟机运行时数据区的各个方面,包括其定义、类型(如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和直接内存)及其作用。文中还探讨了各版本内存区域的变化、直接内存的使用、从线程角度分析Java内存区域、堆与栈的区别、对象创建步骤、对象内存布局及访问定位,并通过实例说明了常见内存溢出问题的原因和表现形式。这些内容帮助开发者深入理解Java内存管理机制,优化应用程序性能并解决潜在的内存问题。
203 29
JVM简介—1.Java内存区域
|
2月前
|
消息中间件 Java 应用服务中间件
JVM实战—2.JVM内存设置与对象分配流转
本文详细介绍了JVM内存管理的相关知识,包括:JVM内存划分原理、对象分配与流转、线上系统JVM内存设置、JVM参数优化、问题汇总。
JVM实战—2.JVM内存设置与对象分配流转

热门文章

最新文章