|
4.3 数据类型 |
在C51语言中,每个变量或者常量在使用前都必须指明数据类型。C51语言中的数据类型不仅具有标准C语言的基本数据类型,还根据运行平台特点而拥有自己的特点。C51语言中的常用数据类型如表4-2所示。
表4-2 C51的常用数据类型
从该表中可以看出,C51语言的数据类型同标准的C语言非常类似,学过C语言的读者可以很容易地掌握。除此之外,C51语言还可以使用数组、指针、结构等特殊数据类型,这些将在后面章节逐步介绍。下面我们将围绕一些典型的数据类型进行讲解。
变量和常量都是用户自定义使用的数据,不同的是,变量在程序执行过程中可以更改数值,而常量则不可以。典型的C51常量示例如下:
C51常量可以直接使用,但对于变量,则需要首先进行声明。变量声明后,C51编译器在单片机内存中单独划分一定的存储单元,用来存放该变量的值。C51变量的声明格式一般为“类型说明符 变量标识符,变量标识符……”。典型的C51常量声明示例如下:
顾名思义,整型数据便是整数类型的数据。C51中可以进一步细分为整型常量和整型变量。
1.整型常量
整型常量也称为整型常数,可以在程序中直接使用。C51语言支持整型常量的十进制、八进制和十六进制数表示。
●十进制整型常量,以非0开始的数字来表示,例如124、-34等。
●八进制整型常量,以0开始的数字来表示,例如07、012等。
●十六进制整型常量,以0x或者0X开始的数字和字母(A~F,a~f),例如0x1A、0xFF、0XC0等。
注意: 如果需要表示负数,则应该在常量表达式的最前面添加负号“-”,例如-34、-010、-0x45等。
注意: 如果需要表示长整型,则可以在常量表达式的最后添加“l”或者“L”,例如21L、0x45L等。
2.整型变量
在C51语言中,整型变量按照修饰符的不同,可以细分为如下几种类型。
●unsigned short int:无符号短整型,简写为unsigned int,字长为2字节共16位二进制数,数据的范围是0~65 535。
●signed short int:有符号短整型,简写为short或int,字长为2字节共16位二进制数,数据的范围是-32 768~32 767。
●unsigned long int:无符号长整型,简写为unsigned long,字长为4字节共32位二进制数,数据的范围是0~4 294 967 295。
●signed long int:有符号长整型,简写为long,字长为4字节共32位二进制数,数据的范围是-2 147 483 648~2 147 483 647。
注意: 变量定义必须放在变量使用之前。另外,在Keil μVision3集成开发环境中,程序代码中间的变量定义将不被识别。因此,一般将变量定义在函数的开头。
整型变量在程序中一般需要和整型常量结合使用,可以进行典型的算术运算。整型变量的程序示例如下。
【范例4-2】 示例代码4-2是一个整型变量使用的示例程序。
示例代码4-2
【运行结果】使用Keil μVision3编译程序可以完成该程序的编译和仿真操作。该程序运行时输出如下结果:
a-x=-20, b+y=81
【代码解析】在该程序中,首先定义了整型变量a、b、c、d,以及无符号整型变量x和y。接着,将整型常量赋值给a、b、x和y。然后,通过计算得到c和d的值。最后,打印输出计算的结果。
字符型数据用于表示单个字符。在C51中可以进一步细分为字符型常量、转义字符和字符型变量。
1.字符型常量
字符型常量是指用一对单引号括起来的单个字符。其中单引号只起定界作用,并不表示字符本身,例如'A'、'5'、'!'等。字符型常量可以在程序中直接使用。在单片机内部,字符是以ASCII码的形式保存的。因此,也可以使用ASCII码值来表示字符,例如0x41表示字符'A'、0x35表示字符'5'、0x21表示字符'!'等。这样,通过ASCII码值也可以实现字符常量的运算,例如:
注意: 在C51中,可以用ASCII码值表示一些不能用符号显式表示的控制字符。例如十进制数13表示回车符、十六进制数0x0A表示换行符、八进制数033表示Esc等。
2.转义字符
转义字符是一种比较特殊的字符,用于表示不可打印或者某些特殊的字符。转义字符用反斜杠“\”后面跟一个字符或一个八进制或十六进制数表示。例如,如果要表示字符“'”,则不能使用‘’’来表示,因为这样将导致编译系统无法正确识别。此时,应该使用转义字符来实现,即‘\’’。C51语言中支持的转义字符,如表4-3所示。
表4-3 转义字符
续表
使用转义字符时需要注意以下几点:
●转义字符中只能使用小写字母来表示,例如“\T”是错误的转义字符。
●在C51语言中,每个转义字符只能看做一个字符。
●不可打印字符必须用转义字符来表示,例如响铃、换行等。
●“\v”垂直制表和“\f”换页符在屏幕显示时没有任何影响,但是在打印机输出时,会影响到打印机的操作。
●使用转义字符“\ddd”可以表示任意字符。其中,“\ddd”为反斜杠后面跟字符所对应的三位八进制ASCII码值。
●使用转义字符“\xhh”可以表示任意字符。其中,“\x”后面跟字符所对应的两位十六进制ASCII码值。
3.字符型变量
字符型变量是保存字符的变量类型。在C51语言中,可以定义如下两种类型的字符型变量。
●有符号字符变量(char):有符号字符型变量的取值范围为-128~127。
●无符号字符变量(unsigned char):无符号字符型变量的取值范围是0~255。
这两种字符型变量的定义格式,示例如下:
在程序中,字符型变量通常和字符型常量一起使用。同字符型常量类似,字符型变量也可以根据其ASCII码值按照整型数据进行操作。字符型变量的程序示例如下:
【范例4-3】 示例代码4-3是一个字符型变量使用的示例程序。
示例代码4-3
【运行结果】使用Keil μVision3编译程序可以完成该程序的编译和仿真操作。该程序运行时输出如下结果:
a1=a
a2=b
b1=a
b2=b
c=A
d=B
【代码解析】在该程序中,首先定义了字符型变量a1、a2、b1、b2、c和d。接着,采用了ASCII码方式为a1和b1赋值,97为字符a的ASCII码,98为字符b的ASCII码。然后采用字符常量方式直接为a2和b2进行赋值。通过运行结果可以验证字符可以按照其ASCII码进行赋值。程序中,还对字符进行运算并为c和d赋值。字符a的ASCII码减去32为字符A的ASCII码,同理,字符b的ASCII码减去32为字符B的ASCII码。这样,也就实现了小写字母到大写字母的简单的转换。
说明: 对于字符的输出需要使用“%c”,这一点和标准的C语言类似。
浮点型数据是用于表示包含小数点的非整型数据类型。在C51中可以进一步细分为浮点型常量和浮点型变量。
1.浮点型常量
浮点型常量由整数部分、尾数部分和指数部分组成,其值表示为十进制形式。例如13.5、1.2e5、-4.5E-2等。一般来说,所有的浮点型常量均默认为float型。
在浮点型常量的指数部分,字母E或e之前必须有数字,表示形式为“数字e±数字”。另外,浮点型常量中E或e后面指数必须为整数,例如“e2.1”、“e 3”等都是不合法的指数形式。
在C51语言中,如果浮点型常量的绝对值小于1,则其小数点前面的零可以省略。例如,0.15可以简写为.15,-0.026e-2可以简写为-.026e-2。
2.浮点型变量
浮点型变量用于保存浮点型数据。C51语言中支持float、double和long double类型的变量。由于单片机的资源不同于PC,因此,C51语言中不具体区分这三种类型。也就是说,这三种浮点类型有相同的精度和取值范围,都将按照float类型对待。浮点型变量字长为4个字节,共32位二进制数,浮点型变量的取值范围为3.4×10 -38 ~3.4×10 +38 。
注意: 在C51语言中,浮点型数据均为有符号浮点数,而没有无符号浮点数。
在程序中,浮点型变量通常和浮点型常量一起使用。浮点型变量的程序示例如下。
【范例4-4】 示例代码4-4是一个浮点型变量使用的示例程序。
示例代码4-4
【运行结果】使用Keil μVision3编译程序可以完成该程序的编译和仿真操作。该程序运行时输出如下结果:
a=-3134.557700
b=2790.500000
4.141590
【代码解析】在该程序中,首先定义了a为单精度浮点型变量,b为双精度浮点型变量。但实际上两者具有相同的精度和取值范围。接着,将浮点型常量赋值给a和b,然后打印输出该浮点型数据。程序末尾还演示了直接打印输出浮点型常量。
说明: 对于浮点型数据的输出需要使用“%f ”,这一点和标准的C语言类似。