数据在内存中的存储

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



一.数据类型介绍

1.1 数据的基本归类

之所以里面包含字符是因为字符在内存中存储的是字符的ASCII码值,ASCII码值是整数,所以字符类型归类到整形。

有符号位说明会把8位中的最高位当成符号位,而无符号位则是8位都是实际数值。

二.整型在内存中的存储

2.1 原码,反码,补码

 

2.2 大小端介绍

我们通过调试输入a,b地址来看内存的时候发现了一个现象,b应该是ff ff ff f6 ,a应该是 00 00 00 14,但在内存的表示中是倒过来的,这又是为什么呢?

int a = 0x11223344 低位放低地址处——小端字节序存储。低位放在高地址处——大端字节序存储。

 

2.3 练习

2.3.1

可以通过判断数值的第一位来验证大小端,这时候用数值1来进行试验。

我们如何取得第一位字节的地址呢?只需要对a的地址进行char*的解引用就行了,char是一位字节,那么char*只能访问一个字节的地址了,由于是用char*强制转换int 类型,所以接收也要用到char类型变量。

 

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

注意这样子写是错误的,已经把a的值拿出来再转换是没用的,因为那并不是把第一个字节拿出来。

2.3.2

结果是:

为什么会是这个结果呢?接下来我来为大家讲解:

所以我们又回来开始的地方进行整形提升:

 

2.3.3

2.3.4

接下来我们继续练习:

其实结果一样,因为截的低8位一致:但有个问题char的范围是-128-127,怎么能存下128呢?

由于-128没法计算,所以只能默认规定10000000为-128

 

从下面两张图可以看出,这些数都是可以轮回的,就比如11111111再加1那么就变成00000000了。

 

2.3.5

2.3.6

在无符号整形中,i的范围是>=0的,这样在条件中只会无限循环,因为它永远满足>=0的条件。

 

2.3.7

还是涉及到了之前的轮回图:

2.3.8

条件恒成立,无限死循环

 

 

三.浮点型在内存中的存储

3.1 例子

以整形形式放进去,那就以整形形式取,以浮点型形式放进去,那就以浮点数形式取。

 

3.2 浮点数存储规则

我们可以看到到写出二进制数时先移位成1.011,再乘以2的2次方(因为2进制移位),又因为是正数,再补上-1的0次方。

最高位存s=0;存E时为2+127——10000001,再存m-011,剩下的20位补0

以上是存储操作,接下来是取:

规则介绍完毕,现在我们回到最开始的问题:

因为是用float存储,所以接下来的二进制序列它会识别成S E M的形式,我们发现E为全0,套用如下规则:

 

真实情况:可以看到,这个数已经是趋近于0了,小得无法想象。

S为0 老规矩 3+127为130 ——10000010,因为是要打印整形,以n的视角看它就是补码,所以取反+1变成原码并打印。

 

 

 

相关文章
|
20天前
|
消息中间件 存储 缓存
kafka 的数据是放在磁盘上还是内存上,为什么速度会快?
Kafka的数据存储机制通过将数据同时写入磁盘和内存,确保高吞吐量与持久性。其日志文件按主题和分区组织,使用预写日志(WAL)保证数据持久性,并借助操作系统的页缓存加速读取。Kafka采用顺序I/O、零拷贝技术和批量处理优化性能,支持分区分段以实现并行处理。示例代码展示了如何使用KafkaProducer发送消息。
|
3月前
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
111 11
|
4月前
|
监控 算法 应用服务中间件
“四两拨千斤” —— 1.2MB 数据如何吃掉 10GB 内存
一个特殊请求引发服务器内存用量暴涨进而导致进程 OOM 的惨案。
118 14
|
4月前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
232 1
|
4月前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
4月前
|
监控 Java easyexcel
面试官:POI大量数据读取内存溢出?如何解决?
【10月更文挑战第14天】 在处理大量数据时,使用Apache POI库读取Excel文件可能会导致内存溢出的问题。这是因为POI在读取Excel文件时,会将整个文档加载到内存中,如果文件过大,就会消耗大量内存。以下是一些解决这一问题的策略:
614 1
|
3月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
635 1
|
2月前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
3月前
|
Java
JVM内存参数
-Xmx[]:堆空间最大内存 -Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的 -Xmn[]:新生代的最大内存 -xx[use 垃圾回收器名称]:指定垃圾回收器 -xss:设置单个线程栈大小 一般设堆空间为最大可用物理地址的百分之80
|
3月前
|
Java
JVM运行时数据区(内存结构)
1)虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧 (2)本地方法栈:为native修饰的本地方法提供的空间,在HotSpot中与虚拟机合二为一 (3)程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码
38 3