C进阶:数据在内存中的存储(1)

简介: C进阶:数据在内存中的存储(1)

引入:

大家好,感谢大家最近的支持,今天也是开始了C进阶一系列的博文的创作,欢迎大佬们来指点,欢迎来一起沟通!!!

数据类型的介绍

我们都知道:C语言具有以下几种数据类型:

char         //字符数据类型(大小:1字节)
short        //短整型(大小:2字节)
int          //整型(大小:4字节)
long         //长整型(大小:4/8字节)
long long    //更长的整型(大小:8字节)
float        //单精度浮点数(大小:4字节)
double       //双精度浮点数(大小:8字节)

这里注意的是:sizeof(int) <= sizeof(long),在上述类型中,我们可以通过limits.h中的(MAX和MIN)获得类型的的最大值和最小值(eg.INT_MAX和INT_MIN能够获得int类型的最大值和最小值)。

类型的意义:1.使用这个类型开辟内存空间的大小(大小决定了使用范围)

                     2.如何看待内存空间的视角。

类型的基本归类

整型家族

char

       unsigned char

       signed char

short

       unsigned short[int]

       signed short[int]

int

       unsigned int

       signed int

long

       unsigned long[int]

       signed long[int]

long long

       unsigned long long[int]

       signed long long[int]

需要注意的是:在这里char类型也算是整型家族,因为字符存储的时候存储的是ASCII码值。

浮点数家族

float(小数点后六位)

double(小数点后15位)

long double(小数点后20位)

构造类型

数组类型(eg.int arr[10]的类型为int [10])

结构体类型 struct

枚举类型 enum

指针类型

int* pi

char* pc

float* pf

void* pv

空类型

void表示空类型(无类型)。

通常应用于函数的返回类型,函数的参数,指针类型。

整形在内存中的存储

众所周知,一个变量的创建是要在内存中开辟空间的。空间的大小是根据不同类型决定的

那么数据在开辟空间中是怎么存储的呢?

我们来看看:比如,

int a = 20;//创建一个整型类型,叫a,这时a申请了四个字节的空间来存放数据
int b = -10;

让我们来看以下概念:

原码,反码,补码

计算机中的符号有三种表示方法,即原码,反码,补码。

三种表示方法均有符号位整数位两部分:符号位(即开头的首个数字)用0来表示正数,用1来表示负数,而数值位三种表示方法各不相同。

原码

直接将数据的二进制按照正负数的形式翻译成二进制即可.

反码

将原码的符号位不变,其他位依次按位取反即可(即1变0,0变1)

补码

将反码+1即可得到补码。

对于正数来说,原码,反码,补码都相同

而对于负数来说,需要用以上方式进行转换。

对于整型来说:数据存放内存中的其实是补码。

为什么呢?是用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理(CPU只有加法器,因此计算机只能做加法运算(即用补码做加法)),你们可以试试看,用补码做加法时才能得到正确结果。

举个例子:

再让我们看一下在内存中的存储:

我们可以看到a和b补码在内存中分别存储的是补码,但我们发现这个数据居然是反的,这是为什么? 这就涉及到了大小端

大小端介绍

大端小端的定义

大端(存储)模式:是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中

小端(存储)模式:是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中

让我们来举个小栗子:

为什么会存在大端小端模式

计算机系统中内存是以字节为单位进行编址的,每个地址单元都唯一的对应着一个字节(8bit)。这可以应对char类型数据的存储需求,因为char类型长度刚好是一字节,但有些类型是超过一个字节的。因此这里就存在着一个如何安排多个字节数据中各字节的存放顺序的问题。正是因为不同的安排顺序导致了大端存储模式和小端存储模式的存在。

如何测试当前机器是大端还是小端

我们都知道,存储方式无非就是大端和小端这两种。即:

正着存:大端存储方式;

倒着存:小端存储方式。

所以我么可以考虑一下用一个数字来测试当前机器的大小端(即用1)。

在x86环境中,1的二进制形式为00000000000000000000000000000001.

所以就无非以下两种情况:

下面来看一下代码实现:

#include<stdio.h>
 
int check_sys()
{
  int i = 1;
  return (* (char*)&i);
}
 
int main()
{
  int ret = check_sys();
  if (ret == 0)
    printf("大端\n");
  else
    printf("小端\n");
 
  return 0;
}

signed和unsigned的区别

对于整型家族来说,有:有符号和无符号的区分。

unsigned char(无符号char)

signed char(有符号char)   (实际用的话编译器是哪个char不确定,vs上是signed char)

short = signed short

int = signed int

下面有个小栗子来大致区分一下unsigned和signed

signed char:01010111(其中第一个0是符号位,其余位为数值位)

unsigned char:01010111(所有位都是数值位)

再来看这两张图:

我们可以看出:(在0-255的范围内)signed char是一个这样的大致循环的形式,而unsigned char则是走了“直线”。

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