基本數據類型簡介
常見的Arduino是基於ATmega的8位 AVR單片機,例如Arduino UNO ,Arduino Nano,Arduino mega2560等。還有高級點 32位的,如Arduino Due。
由於Arduino是基於C/C++語言的,具有平台差異性,因此,其基本數據類型在這2個平台(8位機和32位機)下有差別。8位機下,int占2字節,double和float一樣占4字節。而32位機下int是4字節,double是8字節。由於32位機很少見,本文就只以8位機類型講解。
類型
|
字節數
|
范圍
|
說明
|
char
signed char
unsigned char
|
1
|
-128 ~127
-128 ~127
0~255
|
Arduino中的char是有符號的,等價於signed char。范圍是-128 ~127 。
char目的是用於儲存ASCII字符。如果你想存儲字節數據,建議使用byte來明確代碼目的。
|
byte
|
1
|
0~255
|
byte不是C/C++標准類型,他是Arduino平台下特有的,實際就是無符號8位整型。
Arduino.h中,有這樣的類型定義: typedef uint8_t byte;
|
int
unsigned int
|
2
|
-32768-32767
(2字節有符號)
0~65535
(2字節無符號)
|
在基於ATMega的8位單片機中,如Arduino UNO,Ardunio Mega2560,int是2字節的.
而在有些高級Arduino板,如Arduino Due,SAMD等中,int占4字節。
|
long
unsigned long
|
4
|
-2147483648 ~ 2147483647
0 ~ 4294967295
|
長整型常量末尾要用L標識出來。
如:long num =
29596725L;
|
float
|
4
|
-3.4028235E+38 to 3.4028235E+38
|
\
|
double
|
4
|
-3.4028235E+38 to 3.4028235E+38
|
在基於ATMega的8位單片機中,如Arduino UNO,Ardunio Mega2560,double和float沒有差別,都是4字節的.
而在Due,等高級板中,占8字節。
雖然在8位機的Arduino中float和double是一樣的,但是在32位平台中,double的精度比float高。
|
bool
|
1
|
true 、 false
|
實質就是C++中的bool類型,你也可以使用boolean,因為在Arduino.h中,有這樣的類型定義:
typedef bool boolean;
|
二進制常量
C/C++是不支持在代碼中直接使用二進制格式的字面值的,但是Arduino.h中包含了一個頭文件 "binary.h" ,如下。其作用就是將0~255范圍的整數用一組二進制格式的宏表示,這樣,我們要在程序中顯式的使用0~255范圍內的二進制常量,則可以寫成 以B開頭的格式。
#ifndef Binary_h #define Binary_h #define B0 0 #define B00 0 #define B000 0 #define B0000 0 #define B00000 0 #define B000000 0 #define B0000000 0 #define B00000000 0 #define B1 1 #define B01 1 #define B001 1 #define B0001 1 #define B00001 1 #define B000001 1 #define B0000001 1 #define B00000001 1 #define B10 2 #define B010 2 #define B0010 2 #define B00010 2 #define B000010 2 #define B0000010 2 #define B00000010 2 /*.......篇幅原因,省去........*/ #define B11111110 254 #define B11111111 255 #endif
包含類型大小信息的整數類型
有些做過硬件開發的人會使用類似於 int8_t 、int16_t 等形式的類型,特點是類型本身包含了類型的大小,讓代碼更具有移植性。在Arduino中也可以使用。
需要包含頭文件 #include<inttypes.h >
/*********************整數類型************************/ typedef signed char int8_t; //8bit有符號類型 typedef unsigned char uint8_t; // 8bit無符號類型 typedef signed int int16_t; //16bit有符號類型 typedef unsigned int uint16_t;//16bit有符號類型 typedef signed long int int32_t; //328bit有符號類型 typedef unsigned long int uint32_t; //32bit有符號類型 typedef signed long long int int64_t; //32bit有符號類型.可能無法使用 typedef unsigned long long int uint64_t; //32bit有符號類型,可能無法使用 /***************保存地址值的類型****************/ typedef int16_t intptr_t; //保存地址值的類型,有符號 typedef uint16_t uintptr_t; //保存地址值的類型,無符號 //遠地址類型,用於單片機SRAM大於64K(地址編號為0~65535 )的情況,用intptr_t可能會溢出。 typedef uint32_t uint_farptr_t; typedef int32_t int_farptr_t; /***********宏符號常量,保存了各種類型的最大,最小值**********/ INT8_MAX INT8_MIN UINT_MAX INT16_MAX INT16_MIN UINT16_MAX
INT32_MAX INT32_MIN UINT32_MAX