数据在内存中的存储

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



一.数据类型介绍

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变成原码并打印。

 

 

 

目录
打赏
0
0
0
0
0
分享
相关文章
kafka 的数据是放在磁盘上还是内存上,为什么速度会快?
Kafka的数据存储机制通过将数据同时写入磁盘和内存,确保高吞吐量与持久性。其日志文件按主题和分区组织,使用预写日志(WAL)保证数据持久性,并借助操作系统的页缓存加速读取。Kafka采用顺序I/O、零拷贝技术和批量处理优化性能,支持分区分段以实现并行处理。示例代码展示了如何使用KafkaProducer发送消息。
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
226 12
“四两拨千斤” —— 1.2MB 数据如何吃掉 10GB 内存
一个特殊请求引发服务器内存用量暴涨进而导致进程 OOM 的惨案。
174 14
|
9月前
|
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
539 1
面试官:POI大量数据读取内存溢出?如何解决?
【10月更文挑战第14天】 在处理大量数据时,使用Apache POI库读取Excel文件可能会导致内存溢出的问题。这是因为POI在读取Excel文件时,会将整个文档加载到内存中,如果文件过大,就会消耗大量内存。以下是一些解决这一问题的策略:
1077 1
|
2月前
|
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
252 55
Arthas memory(查看 JVM 内存信息)
Arthas memory(查看 JVM 内存信息)
141 6
JVM简介—1.Java内存区域
本文详细介绍了Java虚拟机运行时数据区的各个方面,包括其定义、类型(如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和直接内存)及其作用。文中还探讨了各版本内存区域的变化、直接内存的使用、从线程角度分析Java内存区域、堆与栈的区别、对象创建步骤、对象内存布局及访问定位,并通过实例说明了常见内存溢出问题的原因和表现形式。这些内容帮助开发者深入理解Java内存管理机制,优化应用程序性能并解决潜在的内存问题。
239 29
JVM简介—1.Java内存区域
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
1395 1

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问