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则是走了“直线”。

相关文章
|
5月前
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
1961 0
|
5月前
|
存储 缓存 NoSQL
内存管理基础:数据结构的存储方式
数据结构在内存中的存储方式主要包括连续存储、链式存储、索引存储和散列存储。连续存储如数组,数据元素按顺序连续存放,访问速度快但扩展性差;链式存储如链表,通过指针连接分散的节点,便于插入删除但访问效率低;索引存储通过索引表提高查找效率,常用于数据库系统;散列存储如哈希表,通过哈希函数实现快速存取,但需处理冲突。不同场景下应根据访问模式、数据规模和操作频率选择合适的存储结构,甚至结合多种方式以达到最优性能。掌握这些存储机制是构建高效程序和理解高级数据结构的基础。
616 1
|
5月前
|
存储 弹性计算 固态存储
阿里云服务器配置费用整理,支持一万人CPU内存、公网带宽和存储IO性能全解析
要支撑1万人在线流量,需选择阿里云企业级ECS服务器,如通用型g系列、高主频型hf系列或通用算力型u1实例,配置如16核64G及以上,搭配高带宽与SSD/ESSD云盘,费用约数千元每月。
560 0
|
11月前
|
消息中间件 存储 缓存
kafka 的数据是放在磁盘上还是内存上,为什么速度会快?
Kafka的数据存储机制通过将数据同时写入磁盘和内存,确保高吞吐量与持久性。其日志文件按主题和分区组织,使用预写日志(WAL)保证数据持久性,并借助操作系统的页缓存加速读取。Kafka采用顺序I/O、零拷贝技术和批量处理优化性能,支持分区分段以实现并行处理。示例代码展示了如何使用KafkaProducer发送消息。
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
438 12
|
监控 算法 应用服务中间件
“四两拨千斤” —— 1.2MB 数据如何吃掉 10GB 内存
一个特殊请求引发服务器内存用量暴涨进而导致进程 OOM 的惨案。
298 14
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
1051 1
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
963 0
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。

热门文章

最新文章