目录
- 什么是变量
- 变量的概念
- 小结
- 变量的使用
- 声明
- 赋值
- 变量的存储
- 变量的类型
- 类型转换
- 隐式转换
- 运算中的隐式转换
- 隐式转换规则
- 强制转换
- 范围超出错误
- 被转换的值不正确
- 无符号转有符号
- 教程导航
- 联系我们
什么是变量
变量的概念
打个比方:
比如说小明在写字,他花了一个小时完成了所有的作业。
字数做为一个数据量来讲,在一个小时其值为0,而在一个小时后其值变成100%。那么这个字数会随着时间的变化而发生改变,我们通常把这种数据称为变量。通俗一点来讲变量就是存储一些以后或者将来会发生变化的数据。
比如说:
我们的内存是一个酒店,酒店里会有很多房间,房间里面住着各种各样的人。
- 变量:我们的房间就可以叫变量。他可以住人
- 变量名:我们通过房间号可以找到这个房间的人
- 变量值:入住的客人相当于我们的数据
- 数据类型:我们的房间分为高档,经济型住房等。不同类型的人住不同型号的房间。
变量在内存中存储也像我们的文件夹,每个数据存储在单独的抽屉内,每个抽屉有自己的标签用于查找数据。

小结
数据是放在内存中的,在内存中存取数据要明确三件事情:数据存储在哪里、数据的长度以及数据的处理方式。
变量名不仅仅是为数据起了一个好记的名字,还告诉我们数据存储在哪里,使用数据时,只要提供变量名即可;而数据类型则指明了数据的长度和处理方式
变量的使用
声明

int item;//类型:(int),变量名:(item)声明变量必需声名其变量名和类型,也可给其初始值(非必需)。
赋值

item = 100;//使用=赋值变量使用=对其赋值,也可以直接在声明时赋值。
变量的存储
计算机的数据是以二进制存储的,其最小的存储单位是一个位(1bit)。其值只有两个真(true)和假(false)。如果要存储更大的数据就使用更多的基本单元(位)来表示更大的数据。
如下图所示:为数据在内存中的表现形式。
其中最小单位为位(bit),每8个位组成一个字节(Byte),每两个字节为一个字(word)

计算机的数据大小通常以字节(byte)为单位
1byte =8bit、1kb = 1024byte、1M =1024 kb
变量的类型
数据类型 | 描述 | 值范围 | 例子 |
bool (布尔) | 布尔变量只有两个值 true(真)、false(假) | 1 bit(位) | bool state= false; |
byte (字节) | 一个字节存储一个8位无符号数字 | 0~255 | byte var = 10; |
char (字符) | 用于储存字符型值 ,请参阅ASCII码表 | ASCII码表 | char var = ‘a’; |
int (整型) | 整型是数字存储的主要数据类型(2字节) | -32,768~32,767(16位) -2,147,483,648~2,147,483,647(32位) 不同主板不同,但至少16位 | int var = 10; |
long (长整型) | 4字节整数 | 2,147,483,648~2,147,483,647(32位) | long var =4000000L;① |
float (浮点) | 存储小数(4字节)6位小数 | 1.2E-38 ~ 3.4E+38 | float var = 0.05; |
double (双精度浮点) | 存储小数(8字节②) | 2.3E-308 ~1.7E+308 | double var = 1.2e12;③ |
short (短型) | 2字节数据 | -32,768 到 32,767 | short var =100; |
word (字) | 至少2字节无符号数据 | 0~65535 | word var = 2000; |
String (字符串)④ | 连续的字符数据 | 无长度限制 | String str = “Hello world!” |
①在赋值常量或计算时在后面加上‘L’以表示此常量为长整型。
②在UNO上double类型和float类型都为4字节,其精度相同。
③串口打印数据时,其值的范围需要在-4294967040.0~4294967040.0之间,否则会打印‘ovf’
④字符串类型可用char数组代替,以NULL(’\0’)终止(char受数组大小限制,而String类型是受长度限制)
上表中包含了常用的数据类型,C中还有许多 其它类型的数据
如unsigned char 、unsigned int、unsigned long其字节数与char、int、long相同。unsigned即表示无符号。(有符号变量使用最高位表示数据的正负)。如unsigned int 即无符号整数(2字节),其范围为0~65535(int范围为-32,768~32,767)。
同理uint8_t、uint16_t、uint32_t、uint64_t即表示无符号8、16、32、64位整数。
类型转换
不同数据类型之间要进行数据运算或者赋值时就需要进行数据转换。
隐式转换
赋值时如果支持类型转换,程序内会默认隐式转换。如下图中。把浮点数赋值给整数型变量。其默认会把浮点数转换为整数,然后赋值给变量。

运算中的隐式转换
如下面的程序输出结果为5,在其运算时使用浮点运算,最后将结果转换为整型。
void setup() {
int a=10;
float b =0.5;
int x= a*b;
Serial.begin(9600);
Serial.println(x);//输出结果为:5
}
void loop() {
}
隐式转换规则
1.若任意一个操作数的类型为long double,则表达式中其他操作数都转化为long double类型;
2.否则,若任意一个操作数的类型为double,则表达式中其他操作数都转化为double类型;
3.否则,若任意一个操作数的类型为float,则表达式中其他操作数都转化为float类型;
4.否则,若任意一个操作数的类型为unsigned long int,则表达式中其他操作数都转化为unsigned long int类型;
5.否则,若任意一个操作数的类型为long int,其他操作数中有unsigned int, 如果long int能容纳unsigned int所有的值,那么unsigned int转化为long int类型,如果long int不能容纳unsigned int的值,那么所有的类型都转化为long int类型;
6.否则,若任意一个操作数的类型为long int,则其他操作数都转化为long int类型;
7.否则,若任意一个操作数的类型为unsigned int,则其他操作数都转化为unsigned int。
看起来比较复杂其实总结一下
long duble > double > float > unsigned long > long int >
void setup() {
unsigned int a = 5;
int b = -1;
int c = 0;
int d = -5;
(d > b + a) ? (c = 1) : (c = -1);
Serial.begin(9600);
Serial.println(c);
}
void loop() {
}上图中程序输出为:1
b+a结果被转换unsigned int 然后再进行比较,比较的时候会把d转换为unsigned int。d的值为-5转换后其值为:65531
隐式转换存在许多便利之处,但使用不当产生的错误很难排除,所以在使用时要特别注意。如产生上图中的不可意料的结果。为防止这种情况发生。最好是使用相同的数据类型进行运算(特别是在有无符号变量上容易出现这种状况)。
为防止出现上图所示的错误我们把b+a的结果转换为int类型与变量b进行比较,下图中结果输出:-1
void setup() {
unsigned int a = 5;
int b = -1;
int c = 0;
int d = -5;
(d > int(b + a)) ? (c = 1) : (c = -1);
Serial.begin(9600);
Serial.println(c);
}
void loop() {
}强制转换
数据类型转换中要注意的事项
范围超出错误
转换错误并不会在程序编译时候报出。
从一个范围大的变量转换到范围小的变量,如果变量的值超出会产生未知的数据。

被转换的值不正确
如果被转换的值不正确将产生未知结果

无符号转有符号
无符号整数转换为整数如果超出范围则会产生未知结果

使用一个更大范围的变量存储

















