Arduino 数据类型
Arduino 提供了各种变量类型用于有效地保存数据,本节将介绍 Arduino 中的数据类型,并讲解如何选择和使用这些数据类型。
我们将数据类型分为「基本数据类型」和「组合数据类型」,组合数据类型其实就是由基本数据类型构成的集合。
基本数据类型
整型
整型即整数类型。Arduino 可使用的整数类型及其取值范围如下表所示。
类型 | 字节 | 取值范围 | 说明 |
---|---|---|---|
int | 2 | -32768 ~ 32767 | 整型 |
unsigned int | 2 | 0 ~ 65535 | 无符号整型 |
long | 4 | -2147483648 ~ 2147483647 | 长整型 |
unsigned long | 4 | 0 ~ 4294967295 | 无符号长整型 |
short | 2 | -32768 ~ 32767 | 短整型 |
注意:上述类型的字节和取值范围是对于 Arduino 常用的 16 位 AVR 控制器来说的,对于 32 位的控制器,如 Arduino Due,int 型和 unsigned int 型占用 4 字节。
浮点型
在 Arduino 中有 float 和 double 两种浮点类型,浮点数其实就是实数。
类型 | 字节 | 取值范围 | 说明 |
---|---|---|---|
float | 4 | 3.4028235E+38 ~ -3.4028235E+38 | 只有 6~7 位有效数字 |
double | 4 | 3.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 类型来表示一个字节的无符号数据类型。
类型 | 字节 | 取值范围 | 说明 |
---|---|---|---|
char | 1 | -128 ~ 127 | 0-127 对应 ASCII 码字符 |
unsigned char | 1 | 0 ~ 255 | 无符号 char 类型 |
byte | 1 | 0 ~ 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 类型的字符串。