你知道数据在内存中是如何存储的嘛?(一)

简介: 你知道数据在内存中是如何存储的嘛?(一)

🦖作者主页:学写代码的恐龙

🦖博客主页:学写代码的恐龙博客主页

🦖专栏:【进阶C语言】

🦖语录:❀未来的你,一定会感谢现在努力奋斗的自己❀

一、数据类型的介绍

  • char   //字符数据类型
  • short   //短整型
  • int    //整形
  • long    //长整型
  • long long   //更长的整形
  • float    //单精度浮点数
  • double    //双精度浮点数

类型的意义:

  • 使用这个类型开辟内存空间的大小(大小决定使用范围)
  • 如何看待内存空间的大小

1.1、类型的基本归类

整型家族:

char

  1. unsigned char
  2. signed char

short

  1. unsigned short [ int ]
  2. signed short [ int ]
  3. int

int

  1. unsigned int
  2. signed int

long

  1. unsigned long [ int ]
  2. signed long [ int ]
  3. 为什么char类型被归整型家族呢?

 因为字符在存储的时候存储的ASCII码值,ASCII是整数,所以在归类的时候,字符属于整型家族

[ int ]是什么意思呢?

 表示在定义变量的时候,可以省略int

short int num;
short num;
//int可以省略这两种定义变量的方法相同

小科普:

 对于short、int、long、ong long这四种类型来说int num = 0;和signed int num = 0等价,short num = 0;和signed short num = 0;等价,long和long long也同理。

 但是对于char类型,char到底是等价于signed char还是unsigned char是取决于编译器的,并没有明确的规定。

浮点型家族:

float

double

构造类型(自定义类型)

数组类型

结构体类型(struct)

枚举类型(enum)

联合类型(union)

数组为什么也是自定义类型呢?

 比如:int arr[0];,它的类型就是:int [10]。int arr[20];,它的类型就是:int [20];。可见随着数组元素个数的变化,数组的类型也在跟着变化,而数组元素的个数又是由用户自行决定的。因此数组被分到了自定义类型里面。

指针类型:

  • int* pi;
  • char* pc;
  • float* pf;
  • void* pv;

空类型:

  • void表示空类型(无类型)
  • 通常应用于函数的返回类型、函数的参数、指针类型

二、整型在内存中的存储

变量的创建是要在内存中开辟空间的。空间的大小是根据不同的类型而决定的

int a = 20;
int b = -10;

 我们都知道要为a分配4个字节的空间,那是如何存储的呢?这就需要了解接下来的知识了。

2.1、原码、反码、补码

 计算机中有三种2进制表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”

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

负整数的三种表示方法各不相同

原码:
  直接将数值按照正负数的形式翻译成二进制就可以得到原码。

反码:
 将原码的符号位不变,其他位依次按位取反就可以得到反码

补码:
 反码+1就得到补码。

对于整型来说:数据存放在内存中其实存放的是补码。为什么呢?

 在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;

 同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

原、反、补之间的相互转化:

e026373367044520a7779d5b0330f4fb.png

int main()
{
  int a = 20;
  //00000000000000000000000000010100 - 原码
  //00000000000000000000000000010100 - 反码
  //00000000000000000000000000010100 - 补码
  int b = -10;
  //10000000000000000000000000001010 - 原码
  //11111111111111111111111111110101 - 反码
  //11111111111111111111111111110110 - 补码
  return 0;
}

cpu中只有加法器:

int main()
{
  int a = 1;
  //00000000000000000000000000000001 - 1的原、反、补
  int b = -1;
  //10000000000000000000000000000001 - -1的原码
  //11111111111111111111111111111110 - -1的反码
  //11111111111111111111111111111111 - -1的补码  
  int c = a - b;
  //cpu中只有加法器,所以:减法会转换成加法进行计算
  //1-1 - 1+(-1)
  //如果是原码相加:
  //00000000000000000000000000000001 - 1的原码
  //10000000000000000000000000000001 - -1的原码
  //10000000000000000000000000000010 - 原码相加结果,还是原码,对应10进制:-2
  //可见,原码相加的结果显然是错的
  //补码相加:
  // 00000000000000000000000000000001 - 1的补码
  // 11111111111111111111111111111111 - -1的补码
  //100000000000000000000000000000000 - 补码相加结果,还是补码,还是int型的整数,所以最高位1保存不了
  //内存中存储:00000000000000000000000000000000 - 这本质上是补码,但是符号位是0,表示正数,,正数的原、反、补相同,所以对应十进制:0
  //需要注意的是:最终的结果是二进制的原码所对应的十进制数字
  return 0;
}


目录
相关文章
|
29天前
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
57 11
|
2月前
|
监控 算法 应用服务中间件
“四两拨千斤” —— 1.2MB 数据如何吃掉 10GB 内存
一个特殊请求引发服务器内存用量暴涨进而导致进程 OOM 的惨案。
|
2月前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
102 1
|
2月前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
2月前
|
监控 Java easyexcel
面试官:POI大量数据读取内存溢出?如何解决?
【10月更文挑战第14天】 在处理大量数据时,使用Apache POI库读取Excel文件可能会导致内存溢出的问题。这是因为POI在读取Excel文件时,会将整个文档加载到内存中,如果文件过大,就会消耗大量内存。以下是一些解决这一问题的策略:
252 1
|
2月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
2月前
|
缓存 安全 Java
使用 Java 内存模型解决多线程中的数据竞争问题
【10月更文挑战第11天】在 Java 多线程编程中,数据竞争是一个常见问题。通过使用 `synchronized` 关键字、`volatile` 关键字、原子类、显式锁、避免共享可变数据、合理设计数据结构、遵循线程安全原则和使用线程池等方法,可以有效解决数据竞争问题,确保程序的正确性和稳定性。
58 2
|
27天前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
211 1
|
16天前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
25天前
|
Java
JVM内存参数
-Xmx[]:堆空间最大内存 -Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的 -Xmn[]:新生代的最大内存 -xx[use 垃圾回收器名称]:指定垃圾回收器 -xss:设置单个线程栈大小 一般设堆空间为最大可用物理地址的百分之80