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

基于STM32常用数据类型分享

[复制链接]
攻城狮Melo 发布时间:2023-3-26 15:47
前述( C6 O  k4 Z# w. x& b
1bit = 1个位 = 一个0/1
; k0 z; W/ e  A1字节 = 8 bit8 n( u$ X; m3 B" B  S1 V* j
C/C++中" O! Y3 B: J" `- M
1.常用的数据类型
) v4 A- S# ~& y5 ~! z6 S字符型 char = 1个字节,范围为:-28~28-1
7 b/ D2 ?' p2 C$ M整型 int = 4个字节,范围为:-2(32-1)~2(32-1)-1: e+ Y+ K- p# c4 e
单精度浮点数 float = 4个字节,范围为:-2128~ +2128-1
$ b) X# {% [! B3 ?! x5 P双精度浮点数 double = 8个字节,范围为:-21024~ +21024-13 F. H# K9 ]" K. D7 O" M: o1 v1 K

" Q+ {* {# a4 p; `
20210523164729291.jpg   s+ r' w- a1 N

# ^3 H$ L- x6 H" V- lint8_t : typedef signed char;
2 f/ t4 F0 x" ~uint8_t : typedef unsigned char;
" M. e! i* B, `+ Dint16_t : typedef signed short ;* a3 @5 f$ i, W1 ?; F
uint16_t : typedef unsigned short ;( \' y% w$ n( Y* _' P: w0 E* w
int32_t : typedef signed int;0 Y* U3 f9 I6 v" K4 U/ q# t! o
uint32_t :typedef unsigned int;
5 F8 |1 c0 O  t, M1 K; |# Z# kint64_t : typedef signed long
0 V3 J5 W' }& e; n9 S. a$ puint64_t : typedef unsigned long. c2 u& m# g/ x) A* W" |& H, O" F* B( _
- h, K% O( x' [
2.嵌入式编程中的无符号类型. K1 {* ?0 X9 x* ]+ w( m
unsigned char = uint8_t = u8
4 G8 O* r# a( v3 n1 A4 j( C: N; xunsigned short = uint16_t = u16% ~# @3 S- T5 _8 z1 l
unsigned int = uint32_t = u327 C/ t  O7 Q! p7 d% K1 Z
因为嵌入式编程中常用十六进制数作为数据类型(0x),所以上述常用的无符号数据类型可以不需要准确计算取值范围,可以直接理解为u多少就是多少bit$ B0 a) ?. v  U

, `1 x* I/ a* S0 [! p6 M- x* Q8 M
例1:$ L$ \. Q8 ~$ e1 V! i% n
  1. u8  a;//8位二进制数据 a最大值0xff 7 g  o2 D% V% C% H: d/ K6 v
  2. //可以直接储存一个8位寄存器的内部数据
    " L# G+ Z6 s3 j) u0 B( b) N

  3. " K! ]1 D3 R$ f$ y6 q
  4. u16 b;//16位二进制数据 b最大值0xffff
    0 Q& |$ k7 z$ I. Q, e: i, y
  5. //可以直接储存一个16位寄存器的内部数据
    2 }& [1 ^( m. r" D! y0 O: H# c! X) Y
  6. & O* N' K" {; B, Q1 D* P1 y- `8 ]
  7. u32 c;//32位二进制数据 c最大值0xffff ffff
    8 q  e! A, W$ M: H. I
  8. //可以直接储存一个32位寄存器的内部数据
    ! f7 B8 m/ t3 h
复制代码

& g' Y9 Q5 X& N6 O例2:USART中的 USART_DR寄存器(USART数据寄存器)
- d& f9 q! W! Q! f( z( T0 M) s8 f% r5 f
2021011821485031.png , i) x1 G& ?8 m- f+ K
  n" U- _) G( |- U( z7 Z( N% J
由手册可以看出这是一个可以储存八位数据的寄存器,那么如果想储存其中的数据可以通过以下方式8 X/ g+ @0 n/ _
  1. u8 Res = 0;" x' u: _3 u! x/ m
  2. Res =USART_ReceiveData(USART1);        //将寄存器中数据储存到Res中% a: Z5 f% b; A& `
复制代码

) |# [: Y% W! ]9 f' H2 B( Z这样Res中就保存了USART_DR中的八位数据; j: w0 `& `3 z" {6 ~! s' p. [

3 g8 ]* C- c, ~0 k" I
数据类型自动转换
# n4 P& k8 T) L, M$ X. k4 @+ I, q1 |; c4 ^
3 X! I0 g8 ?4 F
2021052317232970.jpg
; r$ A' E8 d/ t7 C( b, Q( Z" r/ I' Z' K* _' ^8 [
* l- N. g# d/ Y: O/ N
最近由于开发平台转化至gd32,突然出现了char类型取值范围问题

# W# n( \% \* K按照我对c语言的认知,类似于char, int,long之类的变量应该默认是有符号的变量,但是我出现了下图的问题
1 j6 @% \  D/ I6 d. @6 w- @+ n! p* `) r$ k
5f5201e3f9014f3e9d1fd2fad4c3acb0.png ) _0 X7 a) G! Q2 b6 {4 \) B+ _
' |* E; x8 @* B5 d- @- }7 I% E) L

9 e2 f0 X' X2 J7 u4 N这样print的结果如下所示& Z# ]/ o% }/ \$ o, B4 ^0 O* I$ g

9 J& Y; X3 w$ y& e. e  {. X! f
9f20323eb2164e33be30e9da65684d20.png - X& ~9 c% d+ X) }! r) o2 }

2 ^1 H3 P! Q/ Y6 r; \可以看到,虽然我虽然定义了char类型变量,但是却输出了unsigned char的最大值,并且keil报了一个warning也提示了char是一个无符号的变量。
- z$ C- b) c% r+ N更改为signed char类型之后
4 j( u8 G* G) b6 u" V( ~! l
: @/ V4 E1 _$ u& F# G* m
c529d982b4ed45b6ba9bcd6af5c21101.png
5 J5 A' U) ?3 T7 G- S

& P; O' t: y3 i7 |, {0 {( Y: V$ d可以看到这样的定义才是一个有符号的变量。我尝试了int类型,却默认是有符号的。+ H. L2 V( a7 a1 B# g

9 l* g/ S9 o  c' h9 i( a9 U" P( ~
" A9 L+ G) ]* n9 c7 C
总结
& O1 S( g  Q8 R& Q目前判断可能是keil编译的原因,导致char被编译为unsigned char类型,同学们在编程时需要注意一下。- f. C2 ^" B' W* {1 {& P
目前手边没有stm32的板子,有兴趣的同学可以尝试一下。
6 D. `6 Z0 B/ u1 S————————————————
9 J+ k  h" @" U) O2 N版权声明:一个旅者8 V% G# k% X% v
如有侵权请联系删除" E: Y% [4 K0 n: i! v. Q
8 R' S6 ~. {) a' ]2 \
  h6 j9 B' L& T8 O% W0 E) \+ y% U
收藏 评论0 发布时间:2023-3-26 15:47

举报

0个回答

所属标签

相似技术帖

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