stm32编程过程经常定义变量类型,经常担心数据运算过程中 超过变量类型范围。因为在编程过程中,不同的CPU,其数据类型的意义各不相同,所以一定要注意相应变量数据类型的定义和转换,否则在计算中可能会出现不确定的错误。所以下面列出常见数据类型:
4 Q5 x% D, k6 b' A3 s 一、C语言数据类型stm32使用的数据类型定义在 stm32f30x.h中 - This file contains all the peripheral registers definitions, bits
3 r! [+ [! N/ y7 J - * definitions and memory mapping for STM32F30x devices.
复制代码8 [9 m( k! G7 q. l
整型定义: - #include "core_cm4.h" /* Cortex-M4 processor and core peripherals */1 q, L( @4 Z5 p0 v
-
; f6 ~3 u+ a0 F2 a7 ] - #include "system_stm32f4xx.h"9 g# F! d. U* ?4 @- A5 R
- 8 }1 T7 @4 i0 F% `
- #include <stdint.h>" ]3 X! v! Z) u, r! I1 X$ D
-
1 L1 t0 c5 ^6 {' v) d4 L -
9 R& t( ?, `: S# a$ G! }7 Q - /** @addtogroup Exported_types+ ?- @: i2 M% q+ H% u8 z) q
-
" F; k, H6 r4 d - * @{0 A0 j- {% D" {6 O/ \ \! U* E5 {7 T7 |
-
' ] m) ^6 |4 S. u8 u - */- f3 w. x* @8 K
-
: c+ z1 @& Y# R - /*!< STM32F10x Standard Peripheral Library old types (maintained for legacy purpose) */7 b& ?1 ]2 ?6 X3 ^) r8 S
-
' M& L/ J: q+ [: u5 ^& v* | - typedef int32_t s32;7 [; V" B0 l. A+ Z1 } A P! Q0 B
-
) E( @. l9 M+ r5 f+ O0 ] - typedef int16_t s16;
/ j8 F! C* @9 o" i$ O u$ j9 i -
% j0 g5 Z7 x( n e, Q9 w - typedef int8_t s8;
6 v9 S z% R3 a; F - & G$ S* {8 Q( ~5 y
- 2 q& b" ]4 ~3 F; I% i' O
- typedef const int32_t sc32; /*!< Read Only *// A4 `5 b9 p) z& j A1 C, I) D
- $ s8 R+ t2 B9 \2 ?6 P8 @" X
- typedef const int16_t sc16; /*!< Read Only */
2 s0 i- |7 s0 M* K4 Y - + a; J5 E" L# c$ ]# I+ L
- typedef const int8_t sc8; /*!< Read Only */! q ^4 G! @, u
- & c; [" b3 Z9 z9 k% ^
-
) e9 K6 W2 @3 I! k5 H0 { - typedef __IO int32_t vs32;
: R+ J& S' o( i0 i4 H# W( P' R7 C. { - 0 H- a# x8 A) [
- typedef __IO int16_t vs16;! Y5 r* i ~$ W. y& n6 ~0 E
-
1 L" @+ V" P% h5 ]: j" e C4 {/ h - typedef __IO int8_t vs8;
8 n0 e2 u4 a/ Z9 M - @* P+ l" e4 n, S, p+ I
-
6 L% w( m$ K" H- A% ` - typedef __I int32_t vsc32; /*!< Read Only */( `( j* {( Z9 _! F/ k9 P2 L/ s
-
4 s8 ] O5 G% D, d' F& O" H6 r - typedef __I int16_t vsc16; /*!< Read Only */
/ T% Z. l& H/ M; I -
6 a" i# q( g: W1 X( n( j4 y' w2 F - typedef __I int8_t vsc8; /*!< Read Only */
+ Q. Y& c: W8 Z3 o - ) I% S7 T# A! B" ^& r* B- U
- $ K4 T7 E, G- S
- <span style="color:#ff6666;">typedef uint32_t u32; /*常用类型*/ U4 m# ]8 H7 {) i
- 1 D5 v; V: j3 q( v! x
- typedef uint16_t u16;
( ?. j4 T% S( { - ) E7 A" M4 z; ^3 i; x
- typedef uint8_t u8;</span> P' l) o: W+ {4 B7 ~6 Q! Q/ a
-
' p, n* X! O) r! B; a -
" I7 h! q; ]) V F - typedef const uint32_t uc32; /*!< Read Only */4 @6 R5 E+ O2 g. @8 q& m$ t6 h
-
; k2 D, E, y h5 | - typedef const uint16_t uc16; /*!< Read Only */2 L8 ~. M0 l- C' P3 R
- , ?5 R! O& @! Y- y7 W8 t- y. @
- typedef const uint8_t uc8; /*!< Read Only */% ~$ O% R& X1 E% ?& F" P7 `" W1 g+ ?9 |
-
5 f8 ~' l4 Q7 ?- i: R& \0 Z -
( v0 [' o$ T+ W - typedef __IO uint32_t vu32;4 q* d3 \+ s4 g4 S" S
-
& V* U8 R% J1 ^9 Z7 ?4 K% y5 h - typedef __IO uint16_t vu16;
( _5 v2 r/ g1 o+ _9 u; s) p -
/ o x% i) o3 A( C' p" n - typedef __IO uint8_t vu8;
( f* s2 p- }/ \. B - 8 ]( k- Y; V% n
- 0 X8 t/ | ^' \1 h O5 U
- typedef __I uint32_t vuc32; /*!< Read Only */
4 |" ]) _: Q# @# R) O! r, j6 |+ Q - # P# U- U/ m4 ]& p) ?. j
- typedef __I uint16_t vuc16; /*!< Read Only */0 Z0 f+ q3 h7 s! Y0 K; n3 H
-
4 E! R9 e3 W6 p E0 ^$ f1 s6 m: M. m9 ` - typedef __I uint8_t vuc8; /*!< Read Only *
复制代码 0 o9 e1 m n4 d, }0 G) K
' ?# G* A D2 {5 @2 ^
浮点型: - #if !defined(__STRICT_ANSI__) || defined(__USE_C99_MATH)$ F5 m1 h; @9 x# s3 ~+ ?5 D% H
- * J6 z* n7 S& }8 D2 Q& g0 H# T
- /* C99 additions */
( s" w, T9 a. x5 t0 p/ i -
, a- x1 \- L8 I" A$ X7 H# J - typedef float float_t;
Y9 Q, {4 a$ q2 }. c - ' Q* ]: ~# S" T2 \
- typedef double double_t;
复制代码
8 I3 K7 F1 i3 J; C8 A! @3 P- g% D
注:还有float 浮点型 编译器中不能看到其定义(估计已编译了)。 而uint32_t 、uint16_t、uint8_t在哪里定义?在stdint.h文件中,详见下面: - /* exact-width signed integer types */
1 C' A/ u' f2 q9 W! V% R5 o& x -
- T! v/ i0 \+ z" c$ }" }! O - typedef signed char int8_t;+ V1 v; K+ ~$ i
- ( g* z" m, u; R- y1 O' Y9 Z
- typedef signed short int int16_t;, ]- t1 G. ]) g, J
- ) E1 ^% p/ o4 y {+ w7 c. A
- typedef signed int int32_t;0 c1 ^3 Q+ f* F+ X$ Y
- & R) W$ ]9 e+ l- x7 P, Q7 p6 O% x
- typedef signed __int64 int64_t;7 h' n/ r4 j* a, |, q
- 0 @! i, h) N2 E
-
1 d$ _6 y+ X* ]0 o - /* exact-width unsigned integer types */+ o: K' t$ B2 P# x' G1 |% h
- " p$ O' h( ~* w E9 M* N' F
- typedef unsigned char uint8_t;
# m0 D/ Q V& H% s( U* d - 3 V$ ^1 E5 f, ?1 s, a6 d
- typedef unsigned short int uint16_t;2 c* [' P' |: D9 y" P) H w% n5 V
- 1 L& O5 G- d5 t: T; }$ t4 W: e3 F
- typedef unsigned int uint32_t;) Q- p' [0 M' l! S) z1 m( |" ?
- 9 T1 i% a8 X5 ]) _: d( P
- typedef unsigned __int64 uint64_t;7 _6 m, w# E E
- 2 I. z8 P; }$ P3 D& q
-
# s! s3 z% W) S1 n; m - /* minimum values of exact-width signed integer types */. n8 i6 g* {3 N% _$ Q/ c
- 4 I P' o# K; w* k/ M
- #define INT8_MIN -128 /* s8 占用1个byte,数据范围 -2^7 到 (2^7-1) */8 Z' a; A# Z: N2 k, Q
-
5 J7 w/ Q: A% N- c1 X - #define INT16_MIN -32768 /* s16 占用2个byte,数据范围 -2^15 到 (2^15-1) */; l, _+ m: k) X$ ~
- % c& j2 \# X% ^* u2 {# |
- #define INT32_MIN (~0x7fffffff) /* -2147483648 is unsigned s32 占用 4个byte,数据范围 -2^31 到 (2^31-1) */ h8 [5 u1 L _2 Z2 S5 a" c/ R
-
" @) g. n% Z* p - #define INT64_MIN __ESCAPE__(~0x7fffffffffffffffll) /* -9223372036854775808 is unsigned int64_t占用8个byte,数据范围 -2^63 到 (2^63-1) */4 f' l! y7 T! f4 k- x X! {
- # ~, Y) s. R: f8 ^9 w/ o
-
1 G9 B# {9 a$ N2 q" _ - /* maximum values of exact-width signed integer types */, D/ _, ~; [# L: c2 r
- ; c5 v% @8 I. I5 Z7 H* Y T/ P7 p
- #define INT8_MAX 127
- p2 ~( k7 k! A- X+ @3 W# S - ) T% J7 |1 d1 H) I; _
- #define INT16_MAX 32767
$ K( l1 w" t, h/ i5 c, t -
3 ]+ A% Z. U) Y1 Q; n - #define INT32_MAX 21474836475 P2 I* j+ E& i
- B3 ]0 f W0 J. j( A, s( ^1 J
- #define INT64_MAX __ESCAPE__(9223372036854775807ll)
) G2 \6 b+ f; a1 S -
$ C( Y' n& S( Z -
' [: P5 L8 ^( O( v6 I' g) ? ^ - /* maximum values of exact-width unsigned integer types */( d. y% c- }( W6 F% M9 }$ T5 v
- ) `" |, e+ i4 [% Z7 _
- #define UINT8_MAX 255 /* u8 占用1个byte, 数据范围 0 - 2^8*/* ]/ f% w) Q5 F f) y2 |0 O( C# b: T
-
/ e% R/ ~1 {# n4 G0 E* L - #define UINT16_MAX 65535 /* u16 占用2个byte, 数据范围 0 - 2^16*/( T9 v6 q# K' M. M: @7 H4 j2 l$ L. v
-
+ }! X* J1 h/ T' a2 [$ Z - #define UINT32_MAX 4294967295u /* u32 占用4个byte, 数据范围 0 - 2^32*/- g1 T/ T/ z! d! A& S- s1 i
-
- ~+ n) _# m5 i" r) D; h3 F - #define UINT64_MAX __ESCAPE__(18446744073709551615ull)
复制代码
- T9 \+ Y1 d% v) E) M, Z! }( g( W8 Q# a% F! j8 l
由上述可知: 1、有符号整型 - s8 占用1个byte,数据范围 -2^7 到 (2^7-1)
- s16 占用2个byte,数据范围 -2^15 到 (2^15-1)
- s32 占用 4个byte,数据范围 -2^31 到 (2^31-1)2^31 = 2147483647
- int64_t占用8个byte,数据范围 -2^63 到 (2^63-1) 2^63 = 9223372036854775807ll: U0 [" e+ \! A" @/ u4 ^) i7 B. w
* L5 b6 x4 J: m7 Y2 u: ~- {
, N5 K. W" u. d% y
2、无符号整型 - u8 占用1个byte, 数据范围 0 - 2^8
- u16 占用2个byte, 数据范围 0 - 2^16
- u32 占用4个byte, 数据范围 0 - 2^32 2^32 = 4294967295
- uint64_t 占用8个byte, 数据范围 0 - 2^64 2^64 = 18446744073709551615! B3 R" `" R6 P. X+ \# Q
' l* `) ~- i1 P2 p2 q3 i' m; ~
\) u8 x$ c8 L1 {0 w4 T1 P2 Q3、浮点型 - float ——4个byte,有符号型,可以表达负数/小数; Float 类型至少要能精确表示到小数点后6位。
- double——8个byte,有符号型,可以表达负数/小数;Double 类型至少要能精确到小数点后 10 位。
$ T$ u o* Y( f& W1 j- A
3 I$ n8 M, b' w" M8 F
: Q2 t3 m2 f" O, ^转载自:路途…
% y+ e* m, g+ f' F1 b, U9 C如有侵权请联系删除8 s7 |9 W# B' j) k" u+ g; v* s
; P$ f/ B- ^& _) H4 b
1 @ }+ G; g/ |
% u0 J. A3 [' m0 ?2 }* A, T
|