跳到主要内容

Arduino 数据类型

Arduino 提供了各种变量类型用于有效地保存数据,本节将介绍 Arduino 中的数据类型,并讲解如何选择和使用这些数据类型。

我们将数据类型分为「基本数据类型」和「组合数据类型」,组合数据类型其实就是由基本数据类型构成的集合。

基本数据类型

整型

整型即整数类型。Arduino 可使用的整数类型及其取值范围如下表所示。

类型字节取值范围说明
int2-32768 ~ 32767整型
unsigned int20 ~ 65535无符号整型
long4-2147483648 ~ 2147483647长整型
unsigned long40 ~ 4294967295无符号长整型
short2-32768 ~ 32767短整型

注意:上述类型的字节和取值范围是对于 Arduino 常用的 16 位 AVR 控制器来说的,对于 32 位的控制器,如 Arduino Due,int 型和 unsigned int 型占用 4 字节。

浮点型

在 Arduino 中有 float 和 double 两种浮点类型,浮点数其实就是实数。

类型字节取值范围说明
float43.4028235E+38 ~ -3.4028235E+38只有 6~7 位有效数字
double43.4028235E+38 ~ -3.4028235E+38与 float 型的大小相同

注意:对于使用 16 位 AVR 控制器的 Arduino 来说,float 和 double 两者的精度是一样的,都占用 4 字节;而对于 32 位控制器,如 Arduino Due,double 类型占用 8 字节(精度达到 15 位有效数字)。

浮点数字在有些情况下是不准确的,在数据大小比较时,可能会产生奇怪的结果。例如 6.0 / 3.0 可能不等于 2.0。因此在比较浮点数大小时,你应该使两个数字之间的差额的绝对值小于某个小的数字(期待的最小精度),这样就可以近似的得到这两个数字相等这样的结果。

浮点运算速度远远慢于执行整数运算,例如,如果这个循环有一个关键的计时功能,并需要以最快的速度运行,就应该避免浮点运算。因此,通常会把浮点运算转换成整数运算来提高速度。例如,将 9.8 cm 换算成 98 mm 来计算。

字符型

字符型即 char 类型,占用 1 个字节。char 数据类型是有符号的,如果需要定义无符号的变量,应当使用 unsigned char 类型,为了方便使用,Arduino 提供了 byte 类型来表示一个字节的无符号数据类型。

类型字节取值范围说明
char1-128 ~ 1270-127 对应 ASCII 码字符
unsigned char10 ~ 255无符号 char 类型
byte10 ~ 255无符号一个字节(相当于 unsigned char)

char 型主要用于存储字符变量,在存储字符时,需要用单引号引用。

char c = 'A';

实际上,在计算机系统中,字符都是以数字形式存储的,ASCII 码是最常用的数字与字符的对应关系。查看 ASCII 码表,可知字符 'A' 对应十进制数字 65,因此上述变量定义与下面一行等效。

char c = 65;

当然,也可以直接使用二进制或十六进制格式来表示。

byte b = B1000001;    // 二进制表示'A'
byte b = 0x41; // 十六进制表示'A'

布尔型

布尔型变量即 boolean 类型,占用 1 个字节。它的值只有两个:false(假)和 true(真)。

例如:

boolean flag = true;    // 真
boolean flag = false; // 假

组合数据类型

数组

数组是由一组具有相同数据类型的数据构成的集合。数组概念的引入,使得在处理多个相同类型的数据时程序更加清晰和简洁。

数组的定义方式如下:

数据类型 数组名称[数组元素个数];

例如,定义一个有5个元素的 int 型数组 a

int a[5];

可以使用 数组名称[下标] 的形式访问数组中的某一个元素。需要注意的是,数组下标是从 0 开始的,对于上面定义的 a 数组,有效的下标是 0~4。

例如,将数组 a 中第1个元素赋值为 100

a[0] = 100;

除了单独给数组元素赋值,也可以在数组定义的时候对数组进行赋值(初始化),例如:

int a[5] = {0};             // 将数组中的所有元素全部赋值为0
int a[5] = {1, 2, 3, 4, 5}; // 给数组中的每个元素初始化指定数值

字符串

与 C++ 类似,在 Arduino 中,字符串的定义方式有两种:一种是以字符型数组方式定义,另一种是使用 String 类型定义。

char 数组即由字符元素组成的数组,是 C/C++ 中最基本的字符串定义方式。例如:

char str[] = "getiot.tech";

使用字符数组定义的字符串,其使用方法与数组的使用方法一致,有多少个字符便占用多少个字节的存储空间。也可以像上面那样不指定数组大小,由编译器计算后面的字符串常量的大小来确定数组大小,不过需要注意的是,字符串末尾都有一个不可见的结束符 \0,因此其长度比我们看到的字符数量多一个字节。可以使用 strlen 和 sizeof 测量字符串的长度及占用字节大小。

String 类型除了存储字符串数据本身,还提供多种成员函数,可以完成一些常用的字符串操作,使用起来更为灵活。定义语句如下:

String 字符串名称;

例如,定义一个名为 str 的字符串,并在定义时给它赋值

String str = "getiot.tech";

如果需要操作字符串,可以使用 String 类型提供的成员函数,例如:

/* 获取字符串长度 */
int len = str.length();

/* 截取字符串 */
String str2 = str.substring(0, 6);

/* 合并字符串 */
String str2 = "www." + str;

另外,String 类型在进行数值转换时也很方便。例如:

String n = "123.45";
long number = n.toInt();
float fnumber = n.toFloat();

相较于字符数组的定义方式,使用 String 类型定义字符串会占用更多的存储空间。char 字符数组更节省存储空间,但如果操作字符串较为复杂,如果 Arduino 的存储空间充足,推荐使用 String 类型的字符串。