愛伊米

Arduino--語法07

十一、資料型別

11.1void

void只用在函式宣告中。它表示該函式將不會被返回任何資料到它被呼叫的函式中。

11.2 boolean(布林)

一個布林變數擁有兩個值, true或false。(每個布林變數佔用一個位元組的記憶體。)

11.3char(字元或字串)

一個數據型別,佔用1個位元組的記憶體儲存一個字元值。字元都寫在單引號,如‘A’;(多個字元(字串) 使用雙引號, 如“ABC”) 。

字元以編號的形式儲存。你可以在ASCII表中看到對應的編碼。這意味著字元的ASCII值可以用來作數學計算。(例如‘A’+1, 因為大寫A的ASCII值是65, 所以結果為66) 。如何將字元轉換成數字參考serial。println命令

char資料型別是有符號的型別, 這意味著它的編碼為-128到127。對於一個無符號一個位元組(8位) 的資料型別, 使用byte資料型別。

11.4  unsigned char(無符號資料型別)

一個無符號資料型別佔用1個位元組的記憶體。與byte的資料型別相同。

無符號的char資料型別能編碼0到255的數字。

為了保持Arduino的程式設計風格的一致性, byte資料型別是首選。

11.5   byte(無符號數)

一個位元組儲存8位無符號數,從0到255。

11.6   int(整型)

整數是基本資料型別,佔用2位元組。整數的範圍為-32,768到32,767(-2^15~(2^15)-1)。

整數型別使用2的補碼方式儲存負數。最高位通常為符號位,表示數的正負。其餘位被“取反加1”(此處請參考相關資料,不再贅述)。

Arduino為您處理負數計算問題, 所以數學計算對您是透明的(術語:實際存在, 但不可操作。相當於“黑盒”)。但是,當處理右移位運算子(>>)時,可能有未預期的編譯過程。

11.7 unsigned int(無符號整型)

描述:無符號整型變數擴充了變數容量以儲存更大的資料,它能儲存32位(4位元組)資料。與標準長整型不同無符號長整型無法儲存負數,其範圍從0到4,294,967,295(2^32-1)。

11.8word

描述:一個儲存一個16位元組無符號數的字元, 取值範圍從0到65535, 與unsigned int相同。

例子:

11.9 long(長整數型)

描述:長整數型變數是擴充套件的數字儲存變數,它可以儲存32位(4位元組)大小的變數,從-2,147,483,648到2,147,483,647。

11.10 unsigned long(無符號長整數型)

描述:無符號長整型變數擴充了變數容量以儲存更大的資料,它能儲存32位(4位元組)資料。與標準長整型不同無符號長整型無法儲存負數,其範圍從0到4,294,967,295(2^32-1)。

11.11float(浮點型數)

描述:

float, 浮點型資料, 就是有一個小數點的數字。浮點數經常被用來近似的模擬連續值, 因為他們比整數更大的精確度。浮點數的取值範圍在3。4028235E+38~-3。4028235E+38。它被儲存為32位(4位元組)的資訊。

float只有6-7位有效數字。這指的是總位數, 而不是小數點右邊的數字。與其他平臺不同的是, 在那裡你可以使用double型得到更精確的結果(如15位) , 在Arduino上, double型與float型的大小相同。

浮點數字在有些情況下是不準確的,在資料大小比較時,可能會產生奇怪的結果。例如6。0/3。0可能不等於2。0。你應該使兩個數字之間的差額的絕對值小於一些小的數字,這樣就可以近似的得到這兩個數字相等這樣的結果。

浮點運算速度遠遠慢於執行整數運算,例如,如果這個迴圈有一個關鍵的計時功能,並需要以最快的速度執行,就應該避免浮點運算。程式設計師經常使用較長的程式把浮點運算轉換成整數運算來提高速度。

11.12 double(雙精度浮點數)

描述:

雙精度浮點數。佔用4個位元組。目前的arduino上的double實現和float相同, 精度並未提高。

提示:如果你從其他地方得到的程式碼中包含了double類變數, 最好檢查一遍程式碼以確認其中的變數的精確度能否在arduino上達到。

11.13 string(char array/字串)

string(字串)

描述:

文字字串可以有兩種表現形式。你可以使用字串資料型別(這是0019版本的核心部分),或者你可以做一個字串, 由char型別的陣列和空終止字元(‘\0’) 構成。本節描述了後一種方法。而字串物件(String object) 將讓你擁有更多的功能, 同時也消耗更多的記憶體資源,

宣告字串的解釋

在Str 1中宣告一個沒有初始化的字元陣列

在Str 2中宣告一個字元陣列(包括一個附加字元) , 編譯器會自動新增所需的空字元

在Str 3中明確加入空字元

在Str 4中用引號分隔初始化的字串常數, 編譯器將調整陣列的大小, 以適應字串常量和終止空字元

在Str 5中初始化一個包括明確的尺寸和字串常量的陣列

在Str 6中初始化陣列, 預留額外的空間用於一個較大的字串

空終止字元:

一般來說, 字串的結尾有一個空終止字元(ASCII程式碼0) 。以此讓功能函式(例如Serial。pring() ) 知道一個字串的結束。否則, 他們將從記憶體繼續讀取後續位元組, 而這些並不屬於所需字串的一部分。

這意味著, 你的字串比你想要的文字包含更多的個字元空間。這就是為什麼Str 2和Str 5需要八個字元, 即使“Arduino”只有七個字元-最後一個位置會自動填充空字元。str 4將自動調整為八個字元, 包括一個額外的空。在Str 3的, 我們自己已經明確地包含了空字元(寫入‘\0’) 。

需要注意的是, 字串可能沒有一個最後的空字元(例如在Str 2中您已定義字元長度為7,而不是8)。這會破壞大部分使用字串的功能,所以不要故意而為之。如果你注意到一些奇怪的現象(在字串中操作字元),基本就是這個原因導致的了。

單引號?還是雙引號?

定義字串時使用雙引號(例如“ABC”) , 而定義一個單獨的字元時使用單引號(例如‘A’)

包裝長字串

字串陣列

當你的應用包含大量的文字,如帶有液晶顯示屏的一個專案,建立一個字串陣列是非常便利的。因為字串本身就是陣列,它實際上是一個兩維陣列的典型。在下面的程式碼, ”char*”在字元資料型別char後跟了一個星號‘*’表示這是一個“指標”陣列。所有的陣列名實際上是指標,所以這需要一個數組的陣列。指標對於C語言初學者而言是非常深奧的部分之一,但我們沒有必要了解詳細指標,就可以有效地應用它。

11.14 String object(String類)

描述:

String類, 是0019版的核心的一部分, 允許你實現比運用字元陣列更復雜的文字操作。你可以連線字串,增加字串,尋找和替換子字串以及其他操作。它比使用一個簡單的字元陣列需要更多的記憶體,但它更方便。

僅供參考, 字串陣列都用小寫的string表示而String類的例項通常用大寫的String表示。注意, 在“雙引號”內指定的字元常量通常被作為字元陣列, 並非String類例項。

11.15 array(陣列)

陣列是一種可訪問的變數的集合。Arduino的陣列是基於C語言的, 因此這會變得很複雜, 但使用簡單的陣列是比較簡單的。

建立(宣告)一個數組

下面的方法都可以用來建立(宣告)陣列。

你宣告一個未初始化陣列, 例如my Pins。

在my Pins中, 我們聲明瞭一個沒有明確大小的陣列。編譯器將會計算元素的大小, 並建立一個適當大小的陣列。

當然, 你也可以初始化陣列的大小, 例如在my Sens Vals中。請注意, 當宣告一個char型別的陣列時,你初始化的大小必須大於元素的個數,以容納所需的空字元。

訪問陣列

陣列是從零開始索引的,也就說,上面所提到的陣列初始化,陣列第一個元素是為索引0,因此:

依此類推。

這也意味著,在包含十個元素的陣列中,索引九是最後一個元素。因此,

出於這個原因,你在訪問陣列應該小心。若訪問的資料超出陣列的末尾(即索引數大於你宣告的陣列的大小-1),則將從其他記憶體中讀取資料。從這些地方讀取的資料,除了產生無效的資料外,沒有任何作用。向隨機儲存器中寫入資料絕對是一個壞主意,通常會導致不愉快的結果,如導致系統崩潰或程式故障。要排查這樣的錯誤是也是一件難事。編譯器不會檢查你訪問的陣列是否大於你宣告的陣列。

指定一個數組的值

不同於Basic或JAVA, C語言編譯

my Sens Vals[0] =10;

從陣列中訪問一個值:

X=my Sens Vals[4] ;

陣列和迴圈

陣列往往在for迴圈中進行操作, 迴圈計數器可用於訪問每個陣列元素。例如, 將陣列中的元

素透過串列埠列印,你可以這樣做: