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<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

  

posted @ 2022-01-27 16:58  xiaoberber  阅读(1572)  评论(0编辑  收藏  举报