你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32常用数据类型分享

[复制链接]
攻城狮Melo 发布时间:2023-3-26 15:47
前述
1bit = 1个位 = 一个0/1
1字节 = 8 bit
C/C++中
1.常用的数据类型
字符型 char = 1个字节,范围为:-28~28-1
整型 int = 4个字节,范围为:-2(32-1)~2(32-1)-1
单精度浮点数 float = 4个字节,范围为:-2128~ +2128-1
双精度浮点数 double = 8个字节,范围为:-21024~ +21024-1

20210523164729291.jpg

int8_t : typedef signed char;
uint8_t : typedef unsigned char;
int16_t : typedef signed short ;
uint16_t : typedef unsigned short ;
int32_t : typedef signed int;
uint32_t :typedef unsigned int;
int64_t : typedef signed long
uint64_t : typedef unsigned long

2.嵌入式编程中的无符号类型
unsigned char = uint8_t = u8
unsigned short = uint16_t = u16
unsigned int = uint32_t = u32
因为嵌入式编程中常用十六进制数作为数据类型(0x),所以上述常用的无符号数据类型可以不需要准确计算取值范围,可以直接理解为u多少就是多少bit

例1:
  1. u8  a;//8位二进制数据 a最大值0xff
  2. //可以直接储存一个8位寄存器的内部数据

  3. u16 b;//16位二进制数据 b最大值0xffff
  4. //可以直接储存一个16位寄存器的内部数据

  5. u32 c;//32位二进制数据 c最大值0xffff ffff
  6. //可以直接储存一个32位寄存器的内部数据
复制代码

例2:USART中的 USART_DR寄存器(USART数据寄存器)

2021011821485031.png

由手册可以看出这是一个可以储存八位数据的寄存器,那么如果想储存其中的数据可以通过以下方式
  1. u8 Res = 0;
  2. Res =USART_ReceiveData(USART1);        //将寄存器中数据储存到Res中
复制代码

这样Res中就保存了USART_DR中的八位数据

数据类型自动转换

2021052317232970.jpg


最近由于开发平台转化至gd32,突然出现了char类型取值范围问题

按照我对c语言的认知,类似于char, int,long之类的变量应该默认是有符号的变量,但是我出现了下图的问题

5f5201e3f9014f3e9d1fd2fad4c3acb0.png


这样print的结果如下所示

9f20323eb2164e33be30e9da65684d20.png

可以看到,虽然我虽然定义了char类型变量,但是却输出了unsigned char的最大值,并且keil报了一个warning也提示了char是一个无符号的变量。
更改为signed char类型之后

c529d982b4ed45b6ba9bcd6af5c21101.png

可以看到这样的定义才是一个有符号的变量。我尝试了int类型,却默认是有符号的。


总结
目前判断可能是keil编译的原因,导致char被编译为unsigned char类型,同学们在编程时需要注意一下。
目前手边没有stm32的板子,有兴趣的同学可以尝试一下。
————————————————
版权声明:一个旅者
如有侵权请联系删除


收藏 评论0 发布时间:2023-3-26 15:47

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版