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

文章目录


前言

在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;
};
相关推荐
单片机日志11 分钟前
【单片机毕业设计】【mcugc-mcu826】基于单片机的智能风扇系统设计
stm32·单片机·嵌入式硬件·毕业设计·智能家居·课程设计·电子信息
松涛和鸣1 小时前
从零开始理解 C 语言函数指针与回调机制
linux·c语言·开发语言·嵌入式硬件·排序算法
小屋主人5 小时前
【实用软件】UninstallTool:一个小巧、安全、快速、强大的卸载软件
经验分享·其他·软件·软件卸载
星轨初途6 小时前
数据结构排序算法详解(5)——非比较函数:计数排序(鸽巢原理)及排序算法复杂度和稳定性分析
c语言·开发语言·数据结构·经验分享·笔记·算法·排序算法
小曹要微笑7 小时前
STM32F7 时钟树简讲(快速入门)
c语言·stm32·单片机·嵌入式硬件·算法
XINVRY-FPGA8 小时前
XCVP1802-2MSILSVC4072 AMD Xilinx Versal Premium Adaptive SoC FPGA
人工智能·嵌入式硬件·fpga开发·数据挖掘·云计算·硬件工程·fpga
沐欣工作室_lvyiyi8 小时前
家用按摩椅控制系统设计(论文+源码)
单片机·物联网·毕业设计·按摩椅控制系统
_Minato_9 小时前
计算机系统知识总结——指令系统
经验分享·软考·计算机系统