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

基于STM32常用数据类型分享

[复制链接]
攻城狮Melo 发布时间:2023-3-26 15:47
前述2 D5 t+ D3 r1 n
1bit = 1个位 = 一个0/1
* N+ _" D$ g% J; ~7 H/ k- {1字节 = 8 bit/ J2 M" J' E& e% D( I
C/C++中  U% C9 n5 O; ]' b. i2 S9 u
1.常用的数据类型
, y* I2 X# h' J( H1 A$ P. S, F1 o$ @字符型 char = 1个字节,范围为:-28~28-1
( w% |, i' d7 o整型 int = 4个字节,范围为:-2(32-1)~2(32-1)-1& T' l+ B/ G  _" E
单精度浮点数 float = 4个字节,范围为:-2128~ +2128-15 ~$ ~6 `, j1 X4 R/ Q
双精度浮点数 double = 8个字节,范围为:-21024~ +21024-1
# x# N  @2 F+ E4 g8 r* V2 u: p4 h6 Z. w3 q/ s
20210523164729291.jpg
$ p9 V. J8 q- l9 E! o
- x: f  m7 u1 t6 `0 B& h7 {int8_t : typedef signed char;% S0 _- R: x4 f# [8 M6 _
uint8_t : typedef unsigned char;! M( s/ K+ L2 O* O4 a8 u. ~
int16_t : typedef signed short ;: [& Q0 @$ n) [. B" ]
uint16_t : typedef unsigned short ;
1 A1 t1 E7 P6 y' Zint32_t : typedef signed int;1 a7 b1 K: a! f+ f5 A6 i
uint32_t :typedef unsigned int;* X" }* O% S. Z3 `1 [0 G2 n" B( z
int64_t : typedef signed long
9 O, l3 C2 g. M( C: ^+ ouint64_t : typedef unsigned long1 i# t: P, H' {7 |

5 S' p1 X5 I' j5 O
2.嵌入式编程中的无符号类型. ~/ ?' h/ }8 I4 |4 j, c. g
unsigned char = uint8_t = u8* \" k% s9 c8 N+ ~) A) M# u
unsigned short = uint16_t = u16
+ J2 y, w7 }. r% C0 R  f: Q5 `unsigned int = uint32_t = u32
3 |1 ?3 L1 a% ?* U& c- K. s. K因为嵌入式编程中常用十六进制数作为数据类型(0x),所以上述常用的无符号数据类型可以不需要准确计算取值范围,可以直接理解为u多少就是多少bit
7 d' r9 {0 a! K3 r7 |# s- W& s" |7 a. `, i2 f+ w# G
例1:5 I2 u6 r( L# ~
  1. u8  a;//8位二进制数据 a最大值0xff
    0 `& u, K4 O9 {/ }  W( i/ r6 C
  2. //可以直接储存一个8位寄存器的内部数据) I! J# b! {; V& G/ s( L! _

  3. % F7 N0 \) ?0 q' N
  4. u16 b;//16位二进制数据 b最大值0xffff
    7 Q! N! M# K5 o4 z9 L
  5. //可以直接储存一个16位寄存器的内部数据  d8 G# X1 M6 c' `" a* {6 k: C

  6. ' W/ R/ a; `( P0 ~8 Y/ E- z
  7. u32 c;//32位二进制数据 c最大值0xffff ffff
    8 r( E0 p' A, x
  8. //可以直接储存一个32位寄存器的内部数据
    , X3 e# M' C5 \6 v
复制代码
" x7 b" O' b+ B& k" G
例2:USART中的 USART_DR寄存器(USART数据寄存器)
' \7 X/ V( \: Y: K: ~7 P$ |( E* ^) K5 n; z  D! }
2021011821485031.png 2 C# Z9 D9 Z' {" u4 o
% O+ v) z9 h4 D  d; B  L) N
由手册可以看出这是一个可以储存八位数据的寄存器,那么如果想储存其中的数据可以通过以下方式- R/ f+ W0 _1 m9 Y2 c
  1. u8 Res = 0;) `% Y$ l  V( s! d- i2 A
  2. Res =USART_ReceiveData(USART1);        //将寄存器中数据储存到Res中
    - \( H" t! V/ N& A& p/ D
复制代码

2 }' {) M' M+ e9 [4 t这样Res中就保存了USART_DR中的八位数据
  r+ r0 r0 I3 P3 y7 O
$ }# I' l3 g" N( c) H% V- B; n
数据类型自动转换# i( J, @' E2 W* n7 [5 E

1 T" p( ^* U" s+ V* X
2021052317232970.jpg
) P6 H) R: X, q$ Z6 E4 v" }7 `6 H; D( n3 F3 U( ]( L9 z  ~/ Q0 |- k

3 n7 A- d9 d9 X; Y! P最近由于开发平台转化至gd32,突然出现了char类型取值范围问题

- E* u# N  E9 \& ~! B0 \按照我对c语言的认知,类似于char, int,long之类的变量应该默认是有符号的变量,但是我出现了下图的问题
: f& t: Z% e) \) _/ E% U, y
3 e* }7 b  n/ Z
5f5201e3f9014f3e9d1fd2fad4c3acb0.png - e! b1 g8 f! f- Z7 k! n

& m$ n  ~5 |) b, `3 T2 J
# \/ Z: o& O7 _5 r, ^; e
这样print的结果如下所示
/ V: X8 x& z+ U) H. i- W) p" v1 N, E; x' `/ a' t, }# {
9f20323eb2164e33be30e9da65684d20.png . Q( l: p, @3 B$ B

  B' y1 D% l4 a8 `) j5 N9 c可以看到,虽然我虽然定义了char类型变量,但是却输出了unsigned char的最大值,并且keil报了一个warning也提示了char是一个无符号的变量。
$ G- M2 o' L) m4 l更改为signed char类型之后
  Z! |! I  g# c! B5 T& x0 k, }) h0 m5 C& h5 v7 R
c529d982b4ed45b6ba9bcd6af5c21101.png
, Y6 M* K6 E* d" d$ Q+ ^* M. {
# f  P$ L1 Z7 H, P
可以看到这样的定义才是一个有符号的变量。我尝试了int类型,却默认是有符号的。! B) }7 A- a+ K8 J
( ]; |0 a3 T" D+ G% [: S+ {+ \

% Y! ~& c) T$ Z5 |总结  S7 N" r# G4 V- w
目前判断可能是keil编译的原因,导致char被编译为unsigned char类型,同学们在编程时需要注意一下。
. V+ ]" j' p" U& N% T3 t" [1 q+ I; X目前手边没有stm32的板子,有兴趣的同学可以尝试一下。
5 s+ c" x4 L( ^1 x) d. h————————————————
" n. a& w+ D) O9 H版权声明:一个旅者
. e1 K/ e( Y, R  y如有侵权请联系删除; G0 e4 |- @, A& Q
5 ^' \% y# S5 ], ?

  {; _. F6 v( |3 V
赞 收藏 评论0 发布时间:2023-3-26 15:47

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版