不同数据类型在单片机内存中占多少字节?

文章目录


前言

在C语言中,数据类型指的是用于声明不同类型的变量或者函数的一个广泛的系统。变量的类型决定了变量存储占用的空间


一、不同编译器

类型 16位编译器大小 32位编译器大小 64位编译器大小
char 1个字节 1个字节 1个字节
char*(即指针变量) 2个字节 4个字节(32位的寻址空间是2^32,即32个bit,也就是4个字节) 8个字节
short int 2个字节 2个字节 2个字节
int 2个字节 4个字节 4个字节
unsigned int 2个字节 4个字节 4个字节
float 4个字节 4个字节 4个字节
double 8个字节 8个字节 8个字节
long 4个字节 4个字节 8个字节
long long 8个字节 8个字节 8个字节
unsigned long 4个字节 4个字节 8个字节
c 复制代码
在32位编译器下:
sizeof(char):1  
 
sizeof(short):2
 
sizeof(int):4
 
sizeof(long):4
 
sizeof(float):4
 
sizeof(double):8
 
sizeof(long long):8
 
sizeof(p):4,(p为指针)

指针用来记录另一个对象的地址,在32位计算机中,一个指针变量的返回值必定是4。
指针变量的sizeof值与指针所指的对象没有任何关系。

二、C51

C51属于8位单片机

在单片机的C语言中我们默认的规则如下:short int即为int,long int即为long,前面若无unsigned符号则一律认为是signed型。

* 指针型

指针型本身就是一个变量,在这个变量中存放的指向另一个数据的地址。这个指针变量要占用一定的内存单元,对不同的处理器其长度不一样,在C51中它的长度一般为1~3个字节。

三、sizeof

sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。

1.用于数据类型

使用形式:sizeof(type)

数据类型必须使用括号括住

2.用于变量

使用形式:sizeof(变量名) 或 sizeof + 变量名,变量名可以不用括号括住

sizeof 操作符不能用于函数类型,不完全类型或位字段,不完全类型指具有未知存储大小的数据类型,如:未知存储大小的数组类型、未知内容的结构或联合类型、void 类型等。

结构体

当没有定义 #pragma pack(value) 这种指定 value 字节进行对齐时,结构体的 sizeof 涉及到字节对齐的问题,一般满足三个准则:

(1)结构体变量的首地址能够被其最大基本类型成员的大小所整除。

(2)结构体的每个成员相对于结构体首地址的偏移量都是成员大小的整数倍。

(3)结构体的总大小为结构体最大基本类型成员大小的整数倍。

字节对齐,在 char 后会填充三个字节

空结构体会占一个字节的空间用于占位:

c 复制代码
typedef struct
{
    char a[5];
    int b;
    double c;
}Test;
  没有指定字节对齐。在结构体成员中,a占5个字节,b占4个字节,c占8个字节。5+4+8=17.但是17不是 8的倍数,所以(5+3)+(4+4)+8=24.故占24个字节。

当定义了 #pragma pack(value),以 value字节进行对齐时,它的计算规则如下:整体的大小必须为 value 的最小整数倍。
#pragma pack(4)
typedef struct
{
    char a[5];
    int b;
    double c;
}Test;
   指定4字节对齐,所以(5+3)+4+8=20。故占20个字节。

#pragma pack(2)
typedef struct
{
    char a[5];
    int b;
    double c;
}Test;
   如果指定2字节对齐,那么就是(5+1)+4+8=18个字节。

联合体

联合体各成员共享一个内存,联合体的大小取决于他所有成员中占用空间最大的一个成员的大小。并且对于复合数据类型,如union,struct, class 的对齐方式为成员中最大成员的对齐方式。

c 复制代码
union u               //u的大小是其中最大的double类型成员a,所以sizeof(u) = sizeof(double) = 8;
{
 double a;
 int b;
};

union u1           // u1的大小是char[13] 类型的数组,但由于另一个成员int b ,所以要以4对齐,13以4对齐就是补3位到16;
{
 char a[13];
 int b;
};

union u2          // u2的大小是char[13]类型的数组,不需要补齐,所以长度为13;
{
 char a[13];
 char b;
};
相关推荐
老兵发新帖17 分钟前
ubuntu显示器未知
经验分享
江山如画,佳人北望2 小时前
stm32-c8t6实现语音识别(LD3320)
stm32·单片机·嵌入式硬件
baowxz2 小时前
航芯MCU使用IAR+Jlink调试
单片机·嵌入式硬件
wangxinwei20002 小时前
stm32_LAN8720驱动
stm32·单片机·嵌入式硬件
大叔带刺2 小时前
AUTOSAR实战教程--DoIP_01_配置项解释
单片机·嵌入式硬件
小胖同学~2 小时前
Linux--vsFTP配置篇
stm32·单片机·嵌入式硬件
Tianyanxiao2 小时前
华为×小鹏战略合作:破局智能驾驶深水区的商业逻辑深度解析
大数据·人工智能·经验分享·华为·金融·数据分析
小智学长 | 嵌入式3 小时前
SOC-ESP32S3部分:36-适配自己的板卡
单片机·物联网·esp32
Neil今天也要学习6 小时前
永磁同步电机参数辨识算法--IPMSM拓展卡尔曼滤波全参数辨识
单片机·嵌入式硬件·算法
知识噬元兽9 小时前
【工具使用】STM32CubeMX-FreeRTOS操作系统-信号标志、互斥锁、信号量篇
stm32·单片机·嵌入式硬件