Arduino数据类型
Arduino -数据类型-系列1
数据类型在C语言中是一个很广泛的体系,它用于声明不同类型的变量或函数。变量的类型决定了它在存储中占用多少空间以及如何存储。下面列出了我们在Arduino编程过程中会使用到的所有数据类型。
void
例子:
Void Loop ( ) { // rest of the code }void只在函数声明中使用。它表明,函数不会向调用它的函数返回任何信息。
Boolean
例子:
boolean val = false ; // 用布尔类型声明变量,并用false初始化它. boolean state = true ; // 用布尔类型声明变量,并用true初始化它.布尔类型的变量包含了两个值中,true 或 false。每个布尔变量占用一个字节的内存。
Char
例子:
Char chr_a = 'a' ;//用char类型声明变量,并用字符a初始化它. Char chr_c = 97 ;//用char类型声明变量,并用字符97初始化它.char类似于字符串,这种变量的大小通常为1个字节。书写时,单字符用单引号,比如:’A’;多个字符,使用双引号:”ABC”。当字符以数字形式存储时,需要遵循ASCII码表中的特定编码,这意味着可以使用字符对应的 ASCII 码进行算术运算。比如:’A’ + 1的值是66,因为大写字母A的ASCII 码是65。 范围是-128 ~127 。
unsigned char
例子:
Unsigned Char chr_y = 121 ; // 用无符号字符类型声明变量无符号字节型是一种无符号数据类型,占用一个字节的内存。无符号字节类型的取值范围是 0 到 255。
byte
byte 存储一个8位无符号数字,范围从0到255。如:
byte m = 25 ;//用字节类型声明变量,并用25初始化它.int
整形是数字存储的主要数据类型。int 存储一个16位(2字节)的值范围是: -32,768到 32,767 (最小值为-2^15,最大值为(2^15)- 1)。在Arduino中 int 的大小会因开发板的不同而不同。例如,在Arduino Due上,int 存储一个32位(4字节)的值,范围是 -2,147,483,648 到 2,147,483,647 (最小值为-2^31,最大值为(2^31)- 1)。如:
int counter = 32 ;// 用int类型声明变量,并用32初始化它.Unsigned int
无符号整型数在存储方式上与 int 相同,它不存储负值只存储正值,范围是:0 到65,535 (2^16)- 1。对于Arduino Due 它的存储范围从 0 到4,294,967,295 (2^32 – 1)。
Unsigned int counter = 60 ;Word
在Uno和其他基于ATMEGA的开发板上,一个 word 存储一个16位无符号数字。而在 Due 和 Zero 开发板上,word 存储一个32位无符号数字。
word w = 1000 ;//使用类型 word 声明变量,并用1000初始化它.Long
long 长整型常量末尾要用L标识出来,它字节数是4,存储位数32位,范围:从 -2,147,483,648 到 2,147,483,647。
Long velocity = 102346 ;//Long型变量的声明,并用102346初始化它.unsigned long
无符号long变量是用于数字存储和存储32位(4字节)的扩展大小变量。与long不同,无符号long变量不存储负数,其范围从 0 到 4,294,967,295(2^32 – 1)。
Unsigned Long velocity = 101006 ;short
short是16位数据类型。在所有arduino(基于ATMega和ARM)的开发板上,一个short存储一个16位(2字节)的值。这将产生-32,768到32,767的范围(最小值为-2^15,最大值为(2^15)- 1)。
short val = 13 ;float
浮点数的数据类型是具有小数点的数字。浮点数通常用于近似模拟值和连续值,因为它们比整数具有更高的分辨率。浮点数可以大到3.4028235E+38,也可以小到-3.4028235E+38。它们被存储为32位(4字节)的信息。
float num = 1.352;double
在Uno和其他基于ATMEGA的开发板上,double 占用4个字节。也就是说,double 与 float 完全相同,在精度上没有任何提高。在Arduino Due上,double有8 字节(64bit)的精度。
double num = 45.352 ;Arduino -数据类型-系列2
常见的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/*********************整数类型************************/ 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