这些类型定义在
头文件中,用于明确指定数据的位数,适合嵌入式系统中需要精确控制数据大小的场景。
类型 | 位数 | 范围(有符号) | 范围(无符号) | 说明 |
---|---|---|---|---|
int8_t |
8 | -128 到 127 | - | 8 位有符号整数 |
uint8_t |
8 | - | 0 到 255 | 8 位无符号整数 |
int16_t |
16 | -32,768 到 32,767 | - | 16 位有符号整数 |
uint16_t |
16 | - | 0 到 65,535 | 16 位无符号整数 |
int32_t |
32 | -2,147,483,648 到 2,147,483,647 | - | 32 位有符号整数 |
uint32_t |
32 | - | 0 到 4,294,967,295 | 32 位无符号整数 |
int64_t |
64 | -2^63 到 2^63-1 | - | 64 位有符号整数 |
uint64_t |
64 | - | 0 到 2^64-1 | 64 位无符号整数 |
特点:
明确指定数据宽度,避免平台差异。
适合与硬件寄存器、协议数据包等交互。
这些是 C 语言中的标准数据类型,但其大小可能因平台而异,因此在嵌入式系统中使用时需要谨慎。
类型 | 典型位数 | 范围(有符号) | 范围(无符号) | 说明 |
---|---|---|---|---|
char |
8 | -128 到 127 | 0 到 255 | 字符类型,也可用于小整数 |
short |
16 | -32,768 到 32,767 | 0 到 65,535 | 短整数 |
int |
16/32 | 依赖于平台 | 依赖于平台 | 整数类型 |
long |
32/64 | 依赖于平台 | 依赖于平台 | 长整数 |
long long |
64 | -2^63 到 2^63-1 | 0 到 2^64-1 | 超长整数 |
特点:
大小依赖于编译器和平台,可移植性较差。
在嵌入式系统中,建议优先使用
中的固定宽度类型。
嵌入式系统中浮点运算通常较慢,且某些低端微控制器可能不支持硬件浮点单元(FPU),因此浮点类型的使用需要谨慎。
类型 | 位数 | 范围 | 说明 |
---|---|---|---|
float |
32 | 约 ±3.4e-38 到 ±3.4e38 | 单精度浮点数 |
double |
64 | 约 ±1.7e-308 到 ±1.7e308 | 双精度浮点数 |
特点:
浮点运算可能占用较多资源。
如果微控制器没有 FPU,浮点运算会通过软件模拟,效率较低。
用于表示逻辑值(真或假)。
类型 | 位数 | 范围 | 说明 |
---|---|---|---|
bool |
8 | true /false |
布尔类型,定义在
|
特点:
通常用 8 位存储,但实际只使用 1 位。
在嵌入式系统中,可以用 uint8_t
或位域替代以节省空间。
指针用于直接访问内存地址,在嵌入式系统中常用于操作硬件寄存器或动态内存管理。
类型 | 说明 |
---|---|
void* |
通用指针类型 |
uint8_t* |
指向 8 位无符号整数的指针 |
uint32_t* |
指向 32 位无符号整数的指针 |
特点:
指针的大小依赖于架构(例如 8 位、16 位、32 位或 64 位微控制器)。
用于节省内存,将多个布尔值或小范围整数打包到一个字节中。
c
复制
struct { uint8_t flag1 : 1; // 1 位 uint8_t flag2 : 1; // 1 位 uint8_t value : 6; // 6 位 } status;
特点:
适合存储多个标志位或小范围整数。
节省内存,但访问效率可能较低。
用于定义一组命名的常量值。
c
复制
typedef enum { STATE_IDLE, STATE_RUNNING, STATE_ERROR } SystemState;
特点:
提高代码可读性。
实际存储为整数类型(通常是 int
)。
嵌入式系统中,某些硬件寄存器可能需要特定的数据类型,例如:
volatile
类型:用于修饰可能被硬件改变的变量,防止编译器优化。
volatile uint32_t* reg = (uint32_t*)0x40000000;
const
类型:用于修饰只读数据,通常存储在 Flash 中。
const uint8_t table[] = {0x01, 0x02, 0x03};
场景 | 推荐数据类型 | 原因 |
---|---|---|
硬件寄存器操作 | uint8_t 、uint16_t 、uint32_t |
寄存器宽度固定,使用固定宽度类型确保数据匹配。volatile 防止编译器优化。 |
存储小范围整数或标志位 | uint8_t 、int8_t 、位域(Bit-field) |
节省内存,适合小范围数据或多个布尔值打包。 |
计数器或循环变量 | uint8_t 、uint16_t 、uint32_t |
根据计数范围选择合适类型,避免溢出。 |
浮点运算 | float 、定点数(Fixed-point) |
浮点运算较慢,定点数适合没有硬件浮点单元(FPU)的系统。 |
布尔值和标志位 | bool 、uint8_t 、位域(Bit-field) |
bool 可读性高,位域节省内存。 |
协议数据包或通信数据 | uint8_t 、uint16_t 、uint32_t |
协议字段通常有固定宽度,使用固定宽度类型确保数据对齐和解析正确。 |
时间和延时 | uint32_t 、uint16_t |
时间值通常较大,uint32_t 覆盖较大范围。 |
枚举类型 | enum |
提高代码可读性,实际存储为整数类型。 |
动态内存管理 | void* 、uint8_t* |
动态内存管理需要灵活处理不同类型的数据。 |
特殊硬件相关类型 | volatile 、const |
volatile 防止编译器优化,const 将数据存储在 Flash 中,节省 RAM。 |