目录

  • 什么是变量
  • 变量的概念
  • 小结
  • 变量的使用
  • 声明
  • 赋值
  • 变量的存储
  • 变量的类型
  • 类型转换
  • 隐式转换
  • 运算中的隐式转换
  • 隐式转换规则
  • 强制转换
  • 范围超出错误
  • 被转换的值不正确
  • 无符号转有符号
  • 教程导航
  • 联系我们


什么是变量

变量的概念

打个比方:
比如说小明在写字,他花了一个小时完成了所有的作业。

字数做为一个数据量来讲,在一个小时其值为0,而在一个小时后其值变成100%。那么这个字数会随着时间的变化而发生改变,我们通常把这种数据称为变量。通俗一点来讲变量就是存储一些以后或者将来会发生变化的数据。


比如说:
我们的内存是一个酒店,酒店里会有很多房间,房间里面住着各种各样的人。

  • 变量:我们的房间就可以叫变量。他可以住人
  • 变量名:我们通过房间号可以找到这个房间的人
  • 变量值:入住的客人相当于我们的数据
  • 数据类型:我们的房间分为高档,经济型住房等。不同类型的人住不同型号的房间。

变量在内存中存储也像我们的文件夹,每个数据存储在单独的抽屉内,每个抽屉有自己的标签用于查找数据。

米思齐选择esp32后编译不成功怎么办_arduino

小结

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

变量的使用

声明

米思齐选择esp32后编译不成功怎么办_数据_02

int item;//类型:(int),变量名:(item)

声明变量必需声名其变量名和类型,也可给其初始值(非必需)。

赋值

米思齐选择esp32后编译不成功怎么办_操作数_03

item = 100;//使用=赋值

变量使用=对其赋值,也可以直接在声明时赋值。

变量的存储

计算机的数据是以二进制存储的,其最小的存储单位是一个位(1bit)。其值只有两个真(true)和假(false)。如果要存储更大的数据就使用更多的基本单元(位)来表示更大的数据。

如下图所示:为数据在内存中的表现形式。

其中最小单位为位(bit),每8个位组成一个字节(Byte),每两个字节为一个字(word)

米思齐选择esp32后编译不成功怎么办_编程语言_04

计算机的数据大小通常以字节(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位整数。

类型转换

不同数据类型之间要进行数据运算或者赋值时就需要进行数据转换。

隐式转换

赋值时如果支持类型转换,程序内会默认隐式转换。如下图中。把浮点数赋值给整数型变量。其默认会把浮点数转换为整数,然后赋值给变量。

米思齐选择esp32后编译不成功怎么办_arduino_05

运算中的隐式转换

如下面的程序输出结果为5,在其运算时使用浮点运算,最后将结果转换为整型。

void setup() {
  int a=10;
  float b =0.5;
  int x= a*b;
  Serial.begin(9600);
  Serial.println(x);//输出结果为:5
}

void loop() {
}

米思齐选择esp32后编译不成功怎么办_操作数_06

隐式转换规则

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() {
}

强制转换

数据类型转换中要注意的事项

范围超出错误

转换错误并不会在程序编译时候报出。

从一个范围大的变量转换到范围小的变量,如果变量的值超出会产生未知的数据。

米思齐选择esp32后编译不成功怎么办_操作数_07

被转换的值不正确

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

米思齐选择esp32后编译不成功怎么办_arduino_08

无符号转有符号

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

米思齐选择esp32后编译不成功怎么办_arduino_09

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

米思齐选择esp32后编译不成功怎么办_arduino_10