购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

6.4 C51的数据类型

C51的数据类型是C51语言中变量及常量的类型。每个变量在使用之前必须定义其数据类型。C51除了继承了标准C语言中基本的数据类型int、char、short、long、float和double等外,又有自己的特点。例如在C51语言中int和short、float和double具有相同的取值范围和含义。

在C51中有以下几种基本数据类型:整型(int)、浮点型(float)、字符型(char)、无值型(void)。此外,C51语言还提供了几种聚合类型(aggregate types),包括数组、指针、结构、联合(共用体)、枚举和位域。关于这几种聚合类型,将在后面详细介绍,本节主要介绍几种基本数据类型。

C51语言中基本数据类型的字长和取值范围如表6-3所示。

表6-3 基本数据类型的字长和取值范围

说明 :表6-3中,各种基本数据类型的字长和取值范围是假定CPU的字长为16bit。

在基本数据类型中,除void类型外,其前面均可以有各种修饰符。修饰符用来改变基本类型的意义,以便更准确地适应各种情况的需求。修饰符如下:

●signed(有符号)

●unsigned(无符号)

●long(长型符)

●short(短型符)

其中,修饰符signed、short、long和unsigned可以修饰字符型和整型两种基本类型,而修饰符long还可用于double型。C51中所有根据ANSI标准而组合的数据类型的字长和取值范围,如表6-4所示。

表6-4 ANSI标准中的数据类型

说明 :表6-4中,各种数据类型组合的字长和取值范围是假定CPU的字长为16bit。

因为整数类型的默认定义是有符号数,所以singed修饰符经常可以省略。某些编译环境允许将unsigned用于浮点型,如unsigned double。但这一用法并不通用,会降低程序的可移植性,故建议程序设计时一般不要采用。

为了使用方便,C51编译程序允许使用如下的整型简写形式。

●short int简写为short

●long int简写为long

●unsigned short int简写为unsigned short

●unsigned int简写为unsigned

●unsigned long int简写为unsigned long

6.4.1 常量与变量

常量就是在程序执行过程中不改变值的数据量,变量就是在程序运行过程中可以改变值的数据量。常量和变量是计算机程序处理的数据对象。

1.常量

在程序中,常量不接受程序修改的固定值,C51中的常量可为任意数据类型。示例如下:

C51语言还支持字符串常量,这是另一种预定义数据类型的常量。所有的字符串常量引在双撇号之间,例如'This is a string test'。这里需要注意的是,不要把字符常量和字符串常量相混淆,单个字符常量是由单撇号引起来的,如'a'。

2.变量

在程序中,变量是可以被程序修改的数据量。一个完整的变量应该有类型说明符及变量标识符。C51编译器在单片机内存中单独划分一定的存储单元,用来存放该变量的值。

所有的C51变量必须在使用之前定义。定义变量的一般形式是“类型说明符 变量标识符,变量标识符…”。示例如下:

6.4.2 整型数据

整型数据是整数类型的数据。整型数据是最常用的数据类型,下面就介绍整型数据的说明、整型变量的定义及整型常量的表示。

1.整型数据说明

整型数据包括整型变量和整型常量两种,其前面可以加上不同的修饰符,整型数据有以下几种类型。

●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。

在有符号型数据的二进制表示中,字节最高位表示数据的符号,“0”表示正数,“1”表示负数。

2.整型变量定义

定义整型变量的一般格式是“类型说明符 变量标识符,变量标识符…”。示例如下:

其中,类型说明符与变量标识符之间至少有一个空格。在最后一个变量标识符后必须以“;”结尾。另外,在C51中定义变量时,允许同时定义多个相同类型的变量,各变量间用逗号间隔。变量定义必须放在变量使用之前,一般位于函数的开头。示例程序如下:

该程序可以在Keil μVision3集成开发环境中执行,运行结果如下:

a+x=30, b+x=-2

在本例中,int型数据与unsigned int型数据进行相加减运算,可以看到不同类型的整型数据可以进行算术运算。

3.整型常量表示

整型常量及整型常数可以表示十进制、八进制、十六进制的整数值。按不同的进制区分,整型常数有如下三种表示方法。

●十进制数:以非0开始的数来表示。例如220,-560,45 900。

●八进制数:以0开始的数来表示,起始0是必需的引导符。例如06,0 106,05 788。

●十六进制数:以0X或0x开始的数来表示,其中引导符0是必须有的,X即字母,既可用大写,也可用小写。例如0X0D,0XFF,0x4e。

在整型常数后添加一个“L”或“l”字母,则表示该数为长整型数。例如17L,0753L,0Xfa7l等。

整型常量在不加特别说明时总是正值。如果需要的是负值,则负号“-”必须放置于常数表达式的最前面。例如-0x48,-07。

6.4.3 浮点型数据

浮点型数据是用于表示包含小数点的数据类型。下面分别介绍在C51语言中浮点型数据的说明、浮点型数据的定义及浮点型常量的表示。

1.浮点型数据说明

C51语言中支持如下三种类型的浮点数,即float类型、double类型和long double类型。只不过,在C51语言中不具体区分这三种类型,都被当做float类型对待。因此,这三种浮点类型有相同的精度和取值范围。浮点类型的变量字长为4个字节共32位二进制数,取值范围为3.4×10 -38 ~3.4×10 +38 。另外,在C51语言中,浮点型数据均为有符号浮点数,而没有无符号浮点数。

2.浮点型变量定义

浮点型变量的一般定义格式是“类型说明符 变量标识符,变量标识符…”。同整型数据一样,浮点型变量也可以同时定义多个。

示例如下:

该程序可在Keil μVision3集成开发环境中运行,执行结果如下:

a=1134.568000

b=5890.100000

在本例中,a为单精度浮点型变量,有效位数是7位,因此,最后四舍五入为1134.568。b为双精度浮点型变量,在C51中按float型处理,有效位数也是7位。

3.浮点型常量表示

浮点型常量通常称为实型常量,其值可以表示为十进制。浮点型常量的值由整数部分、尾数部分和指数部分组成。一般,在不加说明的情况下,浮点型常量为正值。如果表示负值,需要在常量前使用负号。例如28.57、-57.63、-7.2e-16、8.265。

在C51语言中,所有的浮点常数都被默认为float型。对于绝对值小于1的浮点数,其小数点前面的零可以省略。例如0.27可写为.27、-0.031E-4可写为-.031E-4。

在编译环境中采用默认格式输出浮点数时,最多只保留小数点后六位,不够的后面补零。在浮点型常量中不得出现任何空白符号。字母E或e之前必须有数字,表示形式为“数字e±数字”,且浮点型常量中E或e后面指数必须为整数,例如“e2.1”、“e 3”等都是不合法的指数形式。

6.4.4 字符型数据

字符型变量是用来存放字符的变量类型。字符型变量只能存放一个字符。在信息的传递中,字符、文字等是经常用到的。下面介绍C51中的字符型数据的定义和使用等。

1.字符型变量定义

在C51语言中,可以定义有符号字符变量和无符号字符变量两种类型的字符型变量。字符型变量的定义格式示例如下:

在C51语言中,字符型数据在操作时将按整型数据处理,计算机中的字符是以ASCII码方式表示的,其长度为1个字节。因此,有符号字符型变量的范围为-128~127,无符号字符型变量的值范围是0~255。如果某个变量定义成char,则表明该变量是有符号的,即它将转换成有符号的整型数据。示例如下:

程序中,c1、c2、c3、c4被指定为字符变量。其中,c3和c4分别赋值为两个字符,因此,输出结果为字符。在程序中,将十进制整数97和98分别赋给c1和c2,它的作用也相当于以下两个赋值语句。

c1 = 'a';

c2 = 'b' ;

字符a和b的ASCII码为97和98,因此程序中使用“%c”来表示输出两个字符。

在C51语言中,如果需要存放一个字符串,则需要定义一个字符型数组,将字符串存到该数组中来表示。示例如下:

在C51编译时,系统将留出三个字符的连续空间,即str [0]~str [2]共三个变量,其中最后一个用来存放字符串终止符NULL,即“\0”,只有前两个可以自由赋值。

这段程序可在Keil μVision3集成开发环境中运行,执行结果如下:

str=AB

这里需要注意的是,终止符是编译程序时自动加上的,程序中只对前两个赋值,最后一个不用赋值。如果对str[2]也进行赋值,将导致程序的错误输出。

2.字符常量表示

字符常量是指用一对单引号括起来的一个字符。其中单引号只起定界作用,并不表示字符本身,例如'F','7','!'等。在C51语言中,字符常量单引号中的字符不能是单引号(')和反斜杠(\)。如果需要使用这两个字符,则需要采用转义字符来表示,这将在后面介绍。

在C51语言中,字符是按其所对应的ASCII码值来存储的,一个字符占一个字节。因此也可用该字符的ASCII码值表示,例如十进制数85表示大写字母'U',十六进制数0x5d表示符号']',八进制数0101表示大写字母'A'等。

另外,一些不能用符号表示的控制符,也可以用ASCII码值来表示。例如十进制数13表示回车符、十六进制数0x0A表示换行符、八进制数033表示Esc等。这些控制符是无法在程序中显式地表示的。

由于C51语言中字符常量是按整数(short型)存储的,所以字符常量可以像整数一样在程序中参与相关的运算。示例如下:

这里值得强调的是字符'9'和数字9的区别,前者是字符常量,后者是整型常量,它们的含义和在计算机中的存储方式都截然不同。

下面举一个例子来演示字符常量以及字符常量的运算,程序示例如下:

这段程序可在Keil μVision3集成开发环境中运行,执行结果如下:

c1=A

c2=B

本例是将两个小写字母转换为大写字母。因为'a'的ASCII码为97,而'A'为65,'b'的ASCII码为98,'B'则为66。从ASCII代码表中可以看到,每一个小写字母比对应大写字母的ASCII码大32,即'a'='A'+32。

3.转义字符

转义字符用于表示ASCII码字符集中不可打印的控制字符和特定功能的字符。转义字符是C51语言中表示字符的一种特殊形式。例如可以用于表示字符常量的单引号('),用于表示字符串常量的双引号(')和反斜杠(\)等。转义字符用反斜杠“\”后面跟一个字符或一个八进制或十六进制数表示,如表6-5所示。

表6-5 转义字符

如果需要在字符常量中使用单引号和反斜杠及字符常量中使用双引号和反斜杠时,都必须使用转义字符表示,即在这些字符前加上反斜杠。

在C51语言中,可以使用转义字符\ddd或\xhh方便灵活地表示任意字符。其中,\ddd为斜杠后面跟三位八进制数,该三位八进制数的值即为对应的八进制ASCII码值;\x后面跟两位十六进制数,该两位十六进制数为对应字符的十六进制ASCII码值。

使用转义字符时需要注意以下几点。

●在C51程序中,使用不可打印字符时,通常用转义字符来表示。

●转义字符中只能使用小写字母,每个转义字符只能看做一个字符。

●\v垂直制表和\f 换页符在屏幕中的显示没有任何影响,但是会影响打印机的打印操作。

6.4.5 指针型数据

指针型数据是指向变量所存放地址的数据类型。指针型数据是一种特殊的数据类型,根据所指的变量类型不同,可以分为整型指针、浮点型指针、字符型指针、结构型指针和联合指针。在C51语言中,指针型变量的定义格式如下:

下面以字符型指针变量为例介绍指针型数据的使用,程序示例如下:

这段程序可在Keil μVision3集成开发环境中运行,执行结果如下:

*p=b

该程序中,首先给字符型变量ch赋值'a',然后将ch的地址赋给字符型指针p。这样,p所指向的地址存放的数据是'b'。

6.4.6 无值型数据

无值型数据是一个特殊的类型,其字节长度为0。在C51语言中,无值型主要有以下两个用途。

●定义一个同一类型指针,该指针可根据需要动态分配内存;

●在定义和使用函数时,明确地表示这个函数不返回任何值。

无值型数据的声明示例如下: gnrQK6kaWClB9daP72mLD4HKz7bWlyCb++zFCy1Up16Xow2aSjijN50MDIrVoIVc

点击中间区域
呼出菜单
上一章
目录
下一章
×