|
stm32编程过程经常定义变量类型,经常担心数据运算过程中 超过变量类型范围。因为在编程过程中,不同的CPU,其数据类型的意义各不相同,所以一定要注意相应变量数据类型的定义和转换,否则在计算中可能会出现不确定的错误。所以下面列出常见数据类型:
& Y" I4 i# x- M. P2 r 一、C语言数据类型stm32使用的数据类型定义在 stm32f30x.h中 - This file contains all the peripheral registers definitions, bits 4 P+ r j3 X: |; h) m0 E$ x6 U1 ?
- * definitions and memory mapping for STM32F30x devices.
复制代码; z, Y4 p0 f* G) u9 B+ e
整型定义: - #include "core_cm4.h" /* Cortex-M4 processor and core peripherals */
) {' c8 t2 W7 r0 m! }* b2 R0 l -
5 |' @/ [4 o% i/ y& h - #include "system_stm32f4xx.h"/ c3 k" S4 R2 j1 f& e) v. O
-
' w1 Z5 |& _# N1 o) x n! l+ G) h - #include <stdint.h>% B" l% o9 e0 d& Y% K& ~+ J1 s
-
+ R7 w; v# ^' W2 \0 b5 J - ) U. W. A! S# p! T
- /** @addtogroup Exported_types
2 r: j# f/ b: i( L3 _ - 8 f9 S% P" U; Z% K( X' ?* X
- * @{. O, N! O+ B( z2 ~) ~7 |4 p2 Q
- # w2 E+ u+ _# |8 O9 J) P
- */" P% @1 K; \8 S; E$ z( y
- # q/ G# k: s& r% L/ i
- /*!< STM32F10x Standard Peripheral Library old types (maintained for legacy purpose) */7 [" z/ E& |% U {' a
-
. l7 F# v5 Z+ e/ P& ~/ x - typedef int32_t s32;
2 G8 _7 g1 _' g+ M/ }, ? -
; I- ?0 A c6 l+ u- U/ D1 d - typedef int16_t s16;
+ L: m' o7 p( } -
0 T. x& C0 w2 h6 Z v8 K - typedef int8_t s8;. K; B% w R6 S3 c( R% _
- ; g4 p5 A. Z2 C: L: ^3 J
-
8 P4 f+ O+ i; c4 R' j8 H - typedef const int32_t sc32; /*!< Read Only */1 V& c$ g+ @8 a' u) W/ b
-
* W5 j% }' i$ W. v' d7 ?0 ^% z - typedef const int16_t sc16; /*!< Read Only */
. t. b n! `8 S& w; K a0 k s3 p. T -
* A: m+ [/ H1 u7 B& B - typedef const int8_t sc8; /*!< Read Only */! @' D& i& a" B( n5 s/ {# R
- ( K5 q& X) k- @& @# X) S$ ^, |
- ; ^. S1 c! k8 C n' j' v9 @) A
- typedef __IO int32_t vs32;! A! T6 {% ], K& A) [
-
3 C6 T8 B) g! m( N - typedef __IO int16_t vs16;
* p9 Y8 A! V2 ~/ C -
2 y8 D# h+ B. o - typedef __IO int8_t vs8;
4 j. m7 S* H1 U -
* Y5 ]$ l* y$ `* Z% E: W- L - 3 C& p, a7 t8 x; N' a4 [: \9 Z$ I* R
- typedef __I int32_t vsc32; /*!< Read Only */
+ n, Q" T* ?2 U- i0 b; j -
4 u0 H7 u: |' l, ] - typedef __I int16_t vsc16; /*!< Read Only */% h$ _0 a1 ~4 e! C. C) j! f
-
+ Y# p/ a2 O* K7 u |) } - typedef __I int8_t vsc8; /*!< Read Only */
8 s8 @. |% @, f1 | -
; j) ^4 }; q, x, D - 8 }4 m5 o% r" J0 D' | [
- <span style="color:#ff6666;">typedef uint32_t u32; /*常用类型*/ G: E/ [* X N' u3 e
-
& l& k# S3 E- Z - typedef uint16_t u16;
4 {; @% [0 R0 s, l. z -
5 I+ z$ {1 p" J& O" v - typedef uint8_t u8;</span>$ D2 k) Q0 I- Q
- 4 A9 n8 `, e4 f
- 6 X5 D7 z, E" |" ^0 q1 o. K7 w; G
- typedef const uint32_t uc32; /*!< Read Only */6 |, i/ l4 ?# @! s; B! I% ~# h. ^0 b7 \
- $ ~" L' [9 o1 z4 x) c+ W, R
- typedef const uint16_t uc16; /*!< Read Only */
+ z6 [3 B( E4 g+ A5 _, l) m. ^" f -
5 c& N/ d! d# I4 i - typedef const uint8_t uc8; /*!< Read Only */
0 V- A6 ?! n' c+ N. ^5 d -
$ \9 R# h( @; F9 ]9 q; P% U -
. V9 H4 y. w" B6 y- [# i - typedef __IO uint32_t vu32;* O1 J8 l: C% s8 R9 G9 d7 @
-
/ J/ M# |( u! d3 \8 E; o" w - typedef __IO uint16_t vu16;
2 g- b' Y. p/ r" L0 t -
4 Q# f5 d- V5 g! u% h- q: u - typedef __IO uint8_t vu8;8 `% b$ y8 n5 G) }
- - d: k* z( d% K: ~) Y
- 6 n' K ]; ?) v
- typedef __I uint32_t vuc32; /*!< Read Only */0 Q6 g% c. D) R2 f5 H) {4 R( G& O. `
- 4 {- w$ u6 E/ I4 I6 X/ d# s% g
- typedef __I uint16_t vuc16; /*!< Read Only */, h F9 _' Q$ V' O
- 8 q+ {0 ], R. ^
- typedef __I uint8_t vuc8; /*!< Read Only *
复制代码 2 t) x' N t2 O6 ?) ?
1 V3 g! Y( _! z7 z/ b5 s
浮点型: - #if !defined(__STRICT_ANSI__) || defined(__USE_C99_MATH)- }( \( P/ V5 I/ H! x$ }* G. d' q% _
- 5 C, L0 h" _6 N1 J$ |$ n! r
- /* C99 additions */# W) Q+ I' O% y' ?, D( B
-
. |# l* {1 d& C6 B1 b - typedef float float_t;5 I/ {4 ?- }) i; _' x, ]
-
9 ?& w& H! I. y% e, ?2 i$ y2 ^ - typedef double double_t;
复制代码; s; @, X' d9 h% ^
注:还有float 浮点型 编译器中不能看到其定义(估计已编译了)。 而uint32_t 、uint16_t、uint8_t在哪里定义?在stdint.h文件中,详见下面: - /* exact-width signed integer types */
3 S( ^/ ]) e, u -
9 ^ k5 Y b3 ~2 j - typedef signed char int8_t;* T4 V- p0 T0 j2 o/ m; D- L5 J: S
- $ Y' v& h% J: g$ V
- typedef signed short int int16_t;3 y) i# J% P1 A
-
$ i2 l1 K1 V4 k - typedef signed int int32_t;! @4 B0 C- L4 l) {: a7 [
-
! W f0 G$ E, a; c! f8 G! m - typedef signed __int64 int64_t;3 _& R2 Y5 L7 S" t" D
- ' J$ i9 t7 \" G! a9 N
- 1 t' V9 f3 q7 [ v1 b1 }4 K
- /* exact-width unsigned integer types */4 a' J5 E+ B1 V, n5 `: h
-
5 \& ^1 y! S c8 Y5 B v - typedef unsigned char uint8_t;
* Z% s, g2 S& e: e0 F -
) }3 U i( ]9 _ - typedef unsigned short int uint16_t;2 r) |7 X8 A: u$ _7 n K
- # K5 `6 m, Q0 g# }
- typedef unsigned int uint32_t;) T' g' V X8 `& Q% e% Z4 E
-
0 c" |3 {6 N7 n* o2 u) h; |) H - typedef unsigned __int64 uint64_t;
( K6 c d1 e6 X: K& c -
' V9 d& q& T9 g8 z. u; n7 ]8 y - 7 P$ U! h' G; R6 p7 O6 d9 I
- /* minimum values of exact-width signed integer types */
' d+ M1 b. e' o% h+ p3 G - 0 t4 P! m/ d1 ~+ B+ }/ J
- #define INT8_MIN -128 /* s8 占用1个byte,数据范围 -2^7 到 (2^7-1) */3 N9 L" S. @+ X
-
- ]) ^. E* q, {; _ - #define INT16_MIN -32768 /* s16 占用2个byte,数据范围 -2^15 到 (2^15-1) */
- {9 G/ |; V9 H D - $ \ ?4 f! N1 x: a
- #define INT32_MIN (~0x7fffffff) /* -2147483648 is unsigned s32 占用 4个byte,数据范围 -2^31 到 (2^31-1) */1 Z+ C+ P( u; O0 {7 h' j
- ! m+ h. v% A# f0 x5 r3 K8 N
- #define INT64_MIN __ESCAPE__(~0x7fffffffffffffffll) /* -9223372036854775808 is unsigned int64_t占用8个byte,数据范围 -2^63 到 (2^63-1) */
5 s2 i' J% m3 \1 h+ s& b4 j+ P - 7 N8 M$ {* F% x3 d) V8 ^8 P$ V
-
0 a" R" u1 [# o - /* maximum values of exact-width signed integer types */
! Z. M8 N# f& o' p - B4 L9 Y% r2 H
- #define INT8_MAX 127' }5 w, _0 Z( X; j3 L3 T" B3 ^
- : O9 }8 |3 r s! p0 \
- #define INT16_MAX 32767# u7 g! M! M+ N% h* R2 K
- 6 A, r6 y3 }/ P' q
- #define INT32_MAX 2147483647: s3 k7 v7 j& b/ H/ s# z
- - r5 C6 J3 n6 g
- #define INT64_MAX __ESCAPE__(9223372036854775807ll)' ?8 o; A2 S$ E$ K x6 ^( M$ E3 Z- [
-
0 [( v' y( D% D( I' C3 a* Y - % y& z& J4 X6 U( G
- /* maximum values of exact-width unsigned integer types */
, Q! p; {6 @+ [3 \8 z; w: x - ?) q+ Q: Y' O: s6 c# o7 N7 t
- #define UINT8_MAX 255 /* u8 占用1个byte, 数据范围 0 - 2^8*/ n% _' `0 A9 M3 _$ N, Y0 e, j8 R6 j
-
V0 D5 i E; J! y4 O3 f8 |( R - #define UINT16_MAX 65535 /* u16 占用2个byte, 数据范围 0 - 2^16*/
2 C* H' W7 ~5 a* e: I. M# _+ k -
, z! j# a# @) s - #define UINT32_MAX 4294967295u /* u32 占用4个byte, 数据范围 0 - 2^32*/1 T5 C8 H ?& Q% o
- ; N" o n; |: {9 \0 r5 L
- #define UINT64_MAX __ESCAPE__(18446744073709551615ull)
复制代码
; ?2 |! O0 w0 U+ H G, c# t5 Z0 ?0 r; e6 }0 E; u
由上述可知: 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
% `. V; k+ i3 U% O. q4 t# @ ) f! m; m3 u1 o: D/ p' O/ x
2 G0 [/ W4 d8 F5 V# ?3 q: |7 O 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
# S( z: B% o" _. C& j; d% ^: {
$ }3 i A& y- o* Q, B0 T
6 a! n7 r: e( k7 r+ y1 n3、浮点型 - float ——4个byte,有符号型,可以表达负数/小数; Float 类型至少要能精确表示到小数点后6位。
- double——8个byte,有符号型,可以表达负数/小数;Double 类型至少要能精确到小数点后 10 位。" D F0 y1 }4 h3 u7 p' D+ h
! b4 {, D3 I+ P2 o9 e/ C4 q! h4 J: n, U7 m. e5 ?. k
转载自:路途…
9 v/ e$ f/ Q9 ?$ V) T如有侵权请联系删除
& h3 d; c* Q0 P& \( R
9 w5 L3 Z5 e. c& w: S; e' H& i
* x; J+ f2 u* h' y* t/ }
5 r+ U4 e( a0 L$ g" l |