打印
[STM32F1]

单片机中的数据类型解析

[复制链接]
2604|65
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vivilyly|  楼主 | 2024-6-28 21:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在标准C语言中,存在着如下六种基本数据类型:

  1、char:字符型;

  2、short = short int:短整型

  3、int:整型

  4、long = long int:长整型

  5、float:单精度浮点型

  6、double:双精度浮点型



在Keil MDK 开发环境里,比如一个 无符号32位整形数据会有很多种表示方法:1,unsigned int 32 (C语言标准表达方法) 2,uint32_t ;  3 ,u32;  这三种方式都是在表达同一个意思,可为什么ST的开发人员要搞的这么乱呢? 还有其他好多你可能看起来很陌生 ,很不好理解的表达方式,如:_IO  int32_t  他等同于vs32(这个你同样很陌生),不过他还等同于 volatile int32_t,  还等同于 volatile  signed int 32;最后这种表达方式才是C语言的标准表达方式,够乱吧,能把初学者弄的晕头转向。

其实ST 搞这么多花样,无非是想开发人员在写代码时定义数据类型能少写几个符号,然后又因为前后版本升级,为了兼容旧版本(主要是V2.0)才会出现这么多表示方法。不管他怎么换,都是基于标准C来的,看清楚以下几个文件你就OK了:core_cm3.h   ;stm32f10x.h;   stdint.h;  其中每个文件大概作用如下:

stdint.h 这里放着C语言的标准表达方式

   //第36行开始

typedef   signed          char int8_t;  //  标准表达方式 signed char 被等同于 int8_t;
typedef   signed short     int int16_t;
typedef   signed           int int32_t;//在32位环境里,int代表4个字节32位!!
typedef   signed       __int64 int64_t;


typedef unsigned          char uint8_t;
typedef unsigned short     int uint16_t;
typedef unsigned           int uint32_t;
typedef unsigned       __int64 uint64_t;

typedef   signed          char int_least8_t;
typedef   signed short     int int_least16_t;
typedef   signed           int int_least32_t;
typedef   signed       __int64 int_least64_t;

typedef unsigned          char uint_least8_t;
typedef unsigned short     int uint_least16_t;
typedef unsigned           int uint_least32_t;
typedef unsigned       __int64 uint_least64_t;

typedef   signed           int int_fast8_t;
typedef   signed           int int_fast16_t;
typedef   signed           int int_fast32_t;
typedef   signed       __int64 int_fast64_t;

typedef unsigned           int uint_fast8_t;
typedef unsigned           int uint_fast16_t;
typedef unsigned           int uint_fast32_t;
typedef unsigned       __int64 uint_fast64_t;

typedef   signed           int intptr_t;
typedef unsigned           int uintptr_t;

typedef   signed       __int64 intmax_t;
typedef unsigned       __int64 uintmax_t;


core_cm3.h 文件主要针对动态 静态 变量修饰符做出类型扩展
#ifdef __cplusplus
  #define   __I     volatile            
#else
  #define   __I     volatile const      
#endif
#define     __O     volatile            
#define     __IO    volatile


stm32f10x.h 这个文件主要是为了兼容旧版本吧


typedef int32_t  s32;
typedef int16_t s16;
typedef int8_t  s8;

typedef const int32_t sc32;
typedef const int16_t sc16;
typedef const int8_t sc8;  

typedef __IO int32_t  vs32;
typedef __IO int16_t  vs16;
typedef __IO int8_t   vs8;

typedef __I int32_t vsc32;
typedef __I int16_t vsc16;
typedef __I int8_t vsc8;  

typedef uint32_t  u32;
typedef uint16_t u16;
typedef uint8_t  u8;

typedef const uint32_t uc32;
typedef const uint16_t uc16;
typedef const uint8_t uc8;  

typedef __IO uint32_t  vu32;
typedef __IO uint16_t vu16;
typedef __IO uint8_t  vu8;

typedef __I uint32_t vuc32;
typedef __I uint16_t vuc16;
typedef __I uint8_t vuc8;  

使用特权

评论回复
沙发
高级安全大使| | 2024-6-30 19:33 | 只看该作者
ST等公司在开发自己的库和驱动程序时,通常会定义一些简写类型(如u32、s16等)以简化代码的书写,提高代码的可读性和一致性。

使用特权

评论回复
板凳
4y1b3| | 2024-6-30 19:48 | 只看该作者
_IO  int32_t  他等同于vs32

使用特权

评论回复
地板
suncat0504| | 2024-6-30 22:31 | 只看该作者
有很多修饰符,一般用不到,也不大懂。

使用特权

评论回复
5
tpgf| | 2024-7-1 09:21 | 只看该作者
除了基本类型之外 还支持其他类型的数据吗

使用特权

评论回复
6
磨砂| | 2024-7-1 10:32 | 只看该作者
如何衍生出其他种类的数据类型呢

使用特权

评论回复
7
观海| | 2024-7-1 11:33 | 只看该作者
不同的数据类型占用的字节数在不同的单片机里边是一样的吗

使用特权

评论回复
8
guanjiaer| | 2024-7-1 22:52 | 只看该作者
还是写全称比较好 至少不存在兼容性的问题

使用特权

评论回复
9
八层楼| | 2024-7-1 23:23 | 只看该作者
字符型和短整型都是占据一个字节的长度是吗

使用特权

评论回复
10
晓伍| | 2024-7-1 23:54 | 只看该作者
在大部分情况下 长整型的数据会不会不那么实用呢

使用特权

评论回复
11
deliahouse887| | 2024-7-10 21:10 | 只看该作者
STM32基于ARM Cortex-M内核,通常支持标准的C语言数据类型,同时也提供了特定于微控制器的类型定义,以适应嵌入式系统的内存和性能需求。

使用特权

评论回复
12
maudlu| | 2024-7-10 23:28 | 只看该作者
在选择数据类型时,要考虑数据的范围和所需的精度。例如,如果只需要表示0到255的值,那么使用uint8_t就足够了,这样可以节省内存。如果需要表示更大的范围,可能需要使用uint16_t或uint32_t。

使用特权

评论回复
13
febgxu| | 2024-7-12 14:45 | 只看该作者
指针通常与目标架构的字大小(例如32位)相匹配,但在某些情况下,如指向寄存器的指针,可能需要使用__IO或volatile关键字。

使用特权

评论回复
14
phoenixwhite| | 2024-7-12 17:53 | 只看该作者
STM32编程中可以使用标准C语言库定义的数据类型,也可以使用ARM提供的CMSIS(Cortex Microcontroller Software Interface Standard)数据类型。CMSIS定义了一些特定的数据类型,如uint32_t、int16_t等,这些类型保证了在任何平台上都有一致的位宽。使用CMSIS数据类型可以增加代码的可移植性。

使用特权

评论回复
15
beacherblack| | 2024-7-12 21:37 | 只看该作者
使用位字段可以在结构体中节省空间,但这可能会影响对齐和访问速度。

使用特权

评论回复
16
wangdezhi| | 2024-7-13 10:46 | 只看该作者
数据类型可以是符号型(signed)或无符号型(unsigned)。符号型数据可以表示正数、负数和零,而无符号型数据只能表示非负整数。选择正确的数据类型可以确保数据的正确表示和处理。

使用特权

评论回复
17
51xlf| | 2024-7-13 17:47 | 只看该作者
正确理解和使用数据类型对于确保程序的正确性和效率至关重要。

使用特权

评论回复
18
ulystronglll| | 2024-7-13 21:44 | 只看该作者
在进行数据类型转换时,特别是从较大的数据类型转换为较小的数据类型时,要注意数据溢出和精度损失的问题。

使用特权

评论回复
19
tifmill| | 2024-7-14 10:30 | 只看该作者
不同的数据类型会占用不同大小的内存空间。例如,int8_t占用1个字节,int16_t占用2个字节,int32_t占用4个字节。在资源受限的嵌入式系统中,合理选择数据类型以节省内存是非常重要的。

使用特权

评论回复
20
mickit| | 2024-7-14 16:21 | 只看该作者
结构体和联合体用于封装不同类型的数据,使得可以在一个变量中存储多个数据项。使用时要注意结构体和联合体的大小,因为它们的大小通常是最长的成员决定。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

80

主题

1653

帖子

0

粉丝