数据在内存中的存储

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



一.数据类型介绍

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

 

 

 

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