单片机C语言编程实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.4 常量

常量是程序执行之前已知、运行过程中其值不能改变或不允许改变的数据。C语言有4种类型的常量:整数常量、浮点数常量、字符常量、字符串常量,分别简称为整数、浮点数、字符、字符串。常量一般和程序在一起,保存在程序存储区。

2.4.1 整数

整数有十进制、八进制和十六进制3种形式。

1.十进制整数

如0,123,-45。

2.八进制整数

以数字符0开头并由数字符0~7 组成的数字符序列,为八进制整数。如0123表示八进制整数,其值等于十进制整数1×8×8+2×8+3=83。

3.十六进制整数

以0x(或0X)开头的整数表示十六进制数,它的数字符有16个,它们分别是0~9和A、B、C、D、E、F,其中六个字母也可以小写。例如,0x123表示十六进制整数,其值等于十进制整数1×16×16+2×16+3=291,0xabc的值等于10×16×16+11×16+12=2748。

如果整数后面不带尾缀,一般表示为int或char型整数,在整数之后接上字母L(或l),即为long型整数,如0L、132L等。

在整数之后接上字母U(或u),则指明该整数是unsigned型的。例如1U、122U等。为指明不带符号的long型整数,则需在整型常数之后同时加上字母U和L,表明该整型常数是unsigned long型的,如22UL、35LU等。

2.4.2 浮点数

浮点数的一般书写格式是:

      正负号 整数部分.小数部分 指数部分

其中,正实数可省略正负号;整数部分和小数部分都是十进数字符序列;指数部分是e(或E),接上正负号和十进数字符序列,如为正号可省略,如浮点数-123.456e+3或-123.456E+03,或-123456.7。

按上述格式书写浮点数,另有如下两条限制。

① 整数部分和小数部分可以任选,但不可同时都没有。

② 小数点和指数部分不可以同时都没有。

例如:下列实型常数是C语言合法的实型常数:7,457,1E5,1.5e-6。

而下列写法不是C语言的实型常数:E4,E5,4.0E。

另外,用f尾缀标识float型浮点数,用l(或L)标识long double浮点数,而无后缀符的实型常数被认为是double型浮点数。如1.5、1.5f、1.5L分别表示double型、float型、long double型浮点数。

2.4.3 字符

字符型数据用于表示一个8位的二进位数据,由于二进位数据没有明显的意义,不便于理解,因而用字符表示二进位数据,它们之间的对应关系形成了各种数据编码,目前最常用的编码是ASCII码。字符型数据保存的内容是字符的ASCII码,并非字符本身。

字符的书写方法如下。

① 普通字符:用成对的单引号括起一个字符,如'a'、'b'、'B'、'$'。

② 特殊字符:主要用来表示一些没有对应字符的一些二进位数据,其范围是0x00~0x1f,它们的标记方法见表2-6。

表2-9中的最后两行是直接用字符的ASCII代码表示字符,可以表示全部的字符,例如:'\102'表示'B','\12'表示'\n'。

表2-9 特殊字符

由于字符型数据以ASCII码的二进制形式存储,它与整数的存储形式相类似。对计算机而言:'a'=97=0x61,它们都是以二进制01100001 的形式进行保存,字符型数据是一种比较好理解的二进制数据书写形式。

在C程序中,字符型数据和整型数据之间可以通用,字符型数据与整型数据可混合运算,如23+78=23+'N'='\x17'+0x4e。

一个字符型数据可以用字符格式输出,显示字符本身;也可以用整数形式输出,显示字符的ASCII码值,如例2-1所示。

【例2-1】

字符型数据的输出

      #include<stdio.h>                             //包含输入、输出库函数
      main()
      { char ch1, ch2;
        ch1='a'; ch2='b';
        printf("ch1=%c,ch2=%c\n",ch1,ch2);            //以字符形式打印输出
        printf("ch1=%bd,ch2=%bd\n",ch1,ch2);          //以整数形式输出
      }

程序运行结果如图2-2所示。

图2-2 程序运行结果

2.4.4 字符串

字符串是用一对双引号括起来的若干字符序列,如"How do you do. "。字符串中字符的个数称为字符串长度。如"How do you do.\n"的长度为15,"Good morning.\t"的长度为14,字符串中一个字符都没有,如" ",称为空串,其长度为0。

如果反斜杠和双引号作为字符串中的有效字符,则必须使用转义字符。

例如:

      C:\msdos\v6.22 →"C:\\msdos\\v6.22"
      I say:"Goodbye!" →"I say:\"Goodbye!\""

C语言规定:在存储字符串常量时,由编译器在字符串的末尾自动加一个'\0'作为字符串的结束标志。如果有一个字符串为"CHINA",则它在内存中的实际存储格式见表2-10,最后一个字符'\0'是系统自动加上的,主要便于程序判断字符串是否结束,它占用6字节而非5字节的内存空间。

表2-10 字符串的存储格式

注意

'A'与"A"是两个不同的概念,"A"是存储长度为2的一个字符串,包含了'A'和'\0','A'是一个字符,实际上是值为65的整数。

如果字符串很长,一行写不完,可以跨行书写,例如:

      printf("hello,how are you!");

可以写成:

      printf("hello,h"
            "ow are you!");

下面例子说明用转义字符在输出字符串中的作用。

      #include<stdio.h>            //包含输入、输出库函数
      main()
      { printf("ABC\tabc\txyz\n");
        printf("abc\bxyz\n");
      }

程序运行结果如下。

      ABC    abc     xyz
      abxyz

2.4.5 符号常量

为使程序易于阅读和修改,常给程序中经常使用的常量定义一个有一定含义的名字,这个名字称为符号常量,它是该常量的标识符。定义符号常量有以下三种方法,本节介绍前两种方法。

① 用预处理指令#define定义一个符号常量。

② 用关键字const定义一个符号常量。

③ 用关键字enum定义一组符号常量。

用预处理指令#define定义一个符号常量,常称为宏定义,其一般形式如下。

      #define标识符 常量表达式

例如:

      #define PI    3.14159
      #define MAXN 100
      #define two_pi  PI*2

注意

#define是C语言的预处理命令,和汇编语言的伪指令EQU类似,可以嵌套定义,命令行最后不要另用分号结束。

用const定义一个符号常量的格式如下。

      const [数据类型] [存放位置] 标识符=常量表达式;

例如:

      const int code kk=1000;
      const float xdata PI=3.14159;
      const unsigned char data blank=' ';

在这里,整数kk保存在code程序存储区,占2字节;浮点数PI保存在xdata外部数据区,占4字节;字符blank保存在data直接寻址区,占1字节。

用const定义一个符号常量时,方括号内的数据类型、存放位置如果没有,就使用默认的数据类型的存放位置,具体见“2.5变量”。

注 意用#define和const定义一个符号常量有本质的不同,#define是预处理命令,在编译之前用常量表达式替换所有的与该常量对应的标识符,常量保存在程序存储区中,没有固定的位置。const是C语言的说明语句,需执行相应的指令,编译时为标识符分配相应的存储单元并赋予固定不变的值,每出现一次标识符需从其对应的存储单元中读取数据。

由于用const定义符号常量需占用存储单元,使用数据需花费额外时间,因此尽量用#define定义符号常量。另外,程序中不允许对常量标识符多次赋值。

在定义标识符时应符合下列规定。

① 标识符只能由字母、数字和下画线组成,且以字母或下画线开头,如A1、SD_3、_EW;下列是不合法的标识符:M.D.John、#33、3D4E、μ123。

② 有效长度为1~32个字符。随系统而异,但至少前8个字符有效。如果超长,则超长部分被舍弃。例如:student11和student12的前8个字符相同,有的系统认为这两个变量是一个变量。

③ C语言的关键字不能用做变量名,如if、for、int、data等。

④ 通常应选择能表示数据含义的英文单词(或缩写)作变量名,或汉语拼音字头作变量名,如name、age、gz等。