不管在什么语言中,定义一个变量时必然要在内存中开辟一个相应大小的空间来存储该变量。不同的数据类型在内存所占的空间大小不同,其所能表示的数据范围也不相同。
在单片机C语言中,常用的基本数据类型分为四类九种,归纳如下表1-1:
|
数据类型 |
关键字 |
所占位数 |
表示数据范围 |
|
位类型 |
bit |
1 |
0 &1 |
|
无符号字符型 |
unsigned char |
8 [1B] |
0~255 |
|
有符号字符型 |
char |
8 [1B] |
-128~127 |
|
无符号整型 |
unsigned int |
16 [2B] |
0~65535 |
|
有符号整型 |
int |
16 [2B] |
-32768~32767 |
|
无符号长整型 |
unsigned long |
32 [4B] |
0~2^32 -1 |
|
有符号长整型 |
long |
32 [4B] |
-2^31 ~ 2^32-1 |
|
单精度浮点型 |
float |
32 [4B] |
3.4e-38 ~ 3.4e38 |
|
双精度浮点型 |
double |
64 [8B] |
1.7e-308 ~ 1.7e308 |
表1-1
在声明变量时既要考虑到变量所表示的数据范围,同时也要尽可能的节省所占内存空间。变量的数据类型若选取不当,会造成诸多意想不到的结果。下面结合一个实例分析变量的数据类型的重要性。
在51单片机开发板上利用四位共阴数码管和三个独立按键实现0-99数码自增/自减/复位归零显示,每按下独立按键a键,数码管数值从0开始自增1,到100时自动回0;按下独立按键b键,数码管数值自减1,到-1时自动回99;任何位置按下独立按键c键,数码管数码值回0。
初始代码中声明一个unsigned int 类型的全局变量countNum 作为按键检测计数数值,通过按下a、b、c键改变countNum的值,最后通过数据处理函数将countNum个位和十位分开显示在数码管上。单片机通电后初次按下a、c键一切正常,但初次按下b键显示的并不是设想的数值99,而是如下图1-1左的乱码。
图1-1
初始分析疑似按键检测函数中key2部分代码存在bug(代码如图1-2),但多次更改下载无效,显然问题并不是出现在改段代码中。反复检查后发现只有当变量countNum减到负值时出错且在负数区均为乱码,经检查分析countNum数据类型unsigned int 支持数据范围0~65535,并不包含负数,所以每当自减出现小于0的情况时在其内存空间中出现的均是不确定的数值,因此会出现乱码显示的情况。将countNum数据类型改为char类型(8bit,数据范围-128 ~ 127)后错误消失。同时变量也由16bit变成8bit,大大节省了数据在内存中的存储空间。
图1-2
以上,在声明变量时一定要重视变量的数据范围。