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

基于STM32常用数据类型分享

[复制链接]
攻城狮Melo 发布时间:2023-3-26 15:47
前述
# w5 _6 t  `4 u, J/ E( I1bit = 1个位 = 一个0/1% K! [, h6 I! c5 J  \( N
1字节 = 8 bit; R3 i& {$ G( p0 H  j# `4 k
C/C++中- e+ U# z( |# u9 G! |* K
1.常用的数据类型3 e+ Q) d: W4 m2 A& _, G' M/ O
字符型 char = 1个字节,范围为:-28~28-1* s! Z% x$ X1 D+ e: D
整型 int = 4个字节,范围为:-2(32-1)~2(32-1)-1* U% H: {7 D6 h/ g: K( n  F
单精度浮点数 float = 4个字节,范围为:-2128~ +2128-1
+ @" l  o/ M, |- M双精度浮点数 double = 8个字节,范围为:-21024~ +21024-18 k9 U+ E, {, M( H2 u: e

( i" h& _; ^8 e9 X1 I7 e: \9 y
20210523164729291.jpg ) w) m- A, L$ x7 z  o, P

9 c8 Y3 a/ T- k7 xint8_t : typedef signed char;6 v) Z0 S" o& N, a. l+ V
uint8_t : typedef unsigned char;* `. [* E' b3 Q, l" r" S
int16_t : typedef signed short ;
0 U. P$ Y# q& K/ o! W" Huint16_t : typedef unsigned short ;2 }* O$ \" X' A  U. y( S8 e
int32_t : typedef signed int;, m" y7 N+ O& I. [2 q
uint32_t :typedef unsigned int;
& U- X2 `* N! ~! I9 ?5 qint64_t : typedef signed long
& F$ v; g1 P7 G: ^  wuint64_t : typedef unsigned long) Z5 R$ s' L7 F; J& |. J
0 w9 u5 J6 P, H' e) b
2.嵌入式编程中的无符号类型
6 t' J0 @9 Y$ f6 \5 }unsigned char = uint8_t = u8
- y' k8 Y& C9 Q; g1 ^unsigned short = uint16_t = u16
" F! _# V4 H- S9 j5 \% t- M) W1 j0 ]unsigned int = uint32_t = u322 a2 b+ z5 H+ @- ]' e$ n8 t
因为嵌入式编程中常用十六进制数作为数据类型(0x),所以上述常用的无符号数据类型可以不需要准确计算取值范围,可以直接理解为u多少就是多少bit
$ a+ R# }/ Z8 I  ]
- w* z+ q( F* C1 L$ |0 a3 t
例1:
7 I6 Z5 o9 X- P. E! _* d5 o' h
  1. u8  a;//8位二进制数据 a最大值0xff - L0 R5 O# c. a  p
  2. //可以直接储存一个8位寄存器的内部数据
    % X; e7 R6 H8 G$ d. I

  3. : X+ X' S/ I  c& J: Y
  4. u16 b;//16位二进制数据 b最大值0xffff
    % l! T* U. c7 L! M
  5. //可以直接储存一个16位寄存器的内部数据% B# S) J( C+ N$ r

  6. / T1 C& Y5 m" }
  7. u32 c;//32位二进制数据 c最大值0xffff ffff+ x( a9 z3 S, P5 l, U  x  P! P3 W& e
  8. //可以直接储存一个32位寄存器的内部数据
    3 n; X4 C! x, q9 E: Q) G9 j( f
复制代码
+ N2 b. A: V7 f4 X( s5 R3 O3 c3 o9 O
例2:USART中的 USART_DR寄存器(USART数据寄存器)- O. b# |. p/ I5 O! E

# q- \2 v$ O8 h/ W9 p
2021011821485031.png ; ]5 V, ?! E3 r4 @9 B0 S( n
- ~8 R0 [/ O3 F5 C# `+ h+ b$ m. m
由手册可以看出这是一个可以储存八位数据的寄存器,那么如果想储存其中的数据可以通过以下方式
# l  }; L) N3 [, e
  1. u8 Res = 0;2 h1 F, J. ~- O2 f% O: {9 P
  2. Res =USART_ReceiveData(USART1);        //将寄存器中数据储存到Res中- i8 s/ \8 |( h, T
复制代码
4 o" f. d6 d" a6 z$ ], @* `! G$ H! X
这样Res中就保存了USART_DR中的八位数据' C( q# [" A( F$ }" `4 X$ O3 t

' E( w" H, V. h* c4 Z$ X% _& y
数据类型自动转换
( `3 e2 p4 P; {& I7 J/ d1 s% Y* L. T; a7 P6 H
2021052317232970.jpg ( C$ I9 X: _/ J' K( B5 D: N! q* a1 p
1 s- M% Q6 F3 S# Q5 q$ j, _/ u

5 ]: ?& q- E& j. i: _& h最近由于开发平台转化至gd32,突然出现了char类型取值范围问题

. }+ p0 k+ A# V按照我对c语言的认知,类似于char, int,long之类的变量应该默认是有符号的变量,但是我出现了下图的问题
9 l: R& ?4 [& ~9 d% p$ C! e) j% t& ~; i; c
5f5201e3f9014f3e9d1fd2fad4c3acb0.png
: @5 _, Z. s; N( K4 _
; G" [( l) K0 N6 R7 \

5 ^( J# s6 F4 H, |& U这样print的结果如下所示7 x  @% x0 ^( x! Z; O

' z6 ?5 i" o$ L2 E
9f20323eb2164e33be30e9da65684d20.png
5 G$ b5 e7 S9 N( Y
( L2 A6 P- `) N) d
可以看到,虽然我虽然定义了char类型变量,但是却输出了unsigned char的最大值,并且keil报了一个warning也提示了char是一个无符号的变量。) K$ B8 n' s0 A- D9 J: Y0 u1 H
更改为signed char类型之后! W1 G+ K; \# O) L3 E- c
; P6 w1 @  N- }2 T$ S: d( v
c529d982b4ed45b6ba9bcd6af5c21101.png ! Z/ W1 j' L" P. a) Q% ~
9 X' w+ P, Z' c
可以看到这样的定义才是一个有符号的变量。我尝试了int类型,却默认是有符号的。
/ @) C1 E3 @% v6 Y. v
8 v$ Y( A7 N: u- Z0 }5 r3 ~, t

, N1 N4 L  F9 v2 f总结
5 T! [/ x$ [' d/ J目前判断可能是keil编译的原因,导致char被编译为unsigned char类型,同学们在编程时需要注意一下。& D( b0 a0 h- Q- O7 b
目前手边没有stm32的板子,有兴趣的同学可以尝试一下。9 ^  o6 h" O9 r
————————————————
4 D1 Y4 S; B5 I- U) ]. p版权声明:一个旅者" x# R/ g9 A( U* z" v
如有侵权请联系删除
0 n2 _; h& Q! N+ m# o
! \4 q, C8 g. _
# O& Y/ g. V4 J$ ~" s3 F
收藏 评论0 发布时间:2023-3-26 15:47

举报

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