C51的数据类型
数据的格式通常称为数据类型。标准的C语言的数据类型可分为基本数据类型和组合数据类型,组合数据类型由基本数据类型构造而成。标准的C语言的基本数据类型有字符型char、短整型short、整型int、长整型long、浮点型float、和双精度型double。组合数据类型有数组类型、结构体类型、共同体类型和枚举类型,另外还有指针类型和空类型。C51的居类型也分为基本数据类型和组合数据类型,情况与标准C中的数据类型基本相同,但其中char型与short型相同,float型与double型相同。另外,C51中还有专门针对于MCS-51单片机的特殊功能寄存器型和位类型。具体情况如下:
1、 字符型char
signed charunsigned char之分,默认为signed char。它们的长度均为一个字节,用于存放一个单字节的数据。对于signed char,它用于定义带符号字节数据,其字节的最高位为符号位,“0”表示正数,“1”表示负数,补码表示,所能表示的数值范围是-128~+127;对于unsigned char,评测用于定义无符号字节数据或字符,可以存放一个字节的无符号数,其所表示的数值范围为0~255Unsigned char可以用来存放无符号数,也可以存放西文字
符,一个西文字符占一个字节,在计算机内部用ASCII码存放。
2、 int整型
signed intunsigned int之分,默认为signed int。它们的长度均为两个字节,用于存放一个双字节数据。对于signed int,它用一存放两字节带符号数,补码表示,所能表示的数值范围为-32768~+32767。对于unsigned int,它用于存放两字节无符号数,数的范围为0~65535
3、 long长整型
signed longunsigned long之分,默认为signed long。它们的长度均为四个字节,用于存放一个四字节数据。对于signed long,它用于存放四字节带符号数,补码表示,所能表示的数值范围为-2147483648~+2147483647。对于unsigned long,它用于存放四字节无符号数,所能表示的数值范围为0~4294967295
4、 float浮点型
float型数据的长度为四个字节,格式符合IEEE-754标准的单精度浮点型数据,包含指数和尾数两部分,最高位为符号位,“1”表示负数,“0”表示正数,其次的8位为阶码,最后的23位为尾数的有效位,由于尾数的整数部分隐含为“1”,所以尾数的精度为24位。在内存中的格式如下图所示。
字节地址
3
2
1
0
浮点数的内容
SEEE,EEEE
EMMM,MMMM
MMMM,MMMM
MMMM,MMMM
其中,S为符号位;E为阶码位,共8位,用移码表示。阶码E的正以值范围为1~254,而对应的指数实际取值范围为-126~+127M为尾数的小数部分,共23位,尾数的整数部分始终为“1”。故一个浮点数的取值范围为(-1)S×2E-127×(1.M)
例如浮点数+124.75=+1111,100.11B=+1.1111 0111×2+110,符号位为“0,8位阶码E+110+1111 111=1000 0101B23位数值位为111 1001 1000 0000 0000 0000B32位浮点数表示形式为0100 0010 1111 1001 1000 0000 0000 0000B=42F98000H,在内存中的表式形式如下图所示。
字节地址
3
2
1
0
浮点数的内容
0100 0010
1111 1001
1000 0000
0000 0000
需要指出的是,对于浮点型数据除了正常数值之外,还可能出现非正常数值。根据IEEE标准,当浮点数据取以下数值(16进制数)时即为非正常值:
FFFF FFFFH(非数NaN
7F80 0000H(正溢出+1NF
FF80 0000H(负溢出-1NF
另外,由MCS-51单片机不包括捕获浮点运算错误的中断向量,因此必须由用户自己根据可能出现的错误条件用软件来进行适当的处理。
5*指针型
指针型本身就是一个变量,在这个变量中存放着指向另一个数据的地址。这个指针变量要占用一定的内存单元。对不同的处理器其长度不一样,在C51中它的长度一般为1~3个字节。
6、特殊功能寄存器
这是C51扩充的数据类型,用于访问MCS-51单片机中的特殊功能寄存器数据。它分为sfrsfr16两种类型,其中sfr为字节型特殊功能寄存器类型,占一个内存单元,利用它可以访问MCS-51内部的所有特殊功能寄存器;sfr16为双字节型特殊功能寄存器类型,占用两个字节单元,利用它可以访问MCS-51内部的所有两个字节的特殊功能寄存器。在C51中对特殊功能寄存器的访问必须先用sfrsfr16进行声明。
7、位类型
这也是C51中扩充的数据类型,用于访问MCS-51单片机中可寻址的位单元。在C51中,支持两种位类型:bit型和sbit型。它们在内存中都只占一个二进制位,其值可以是“1”或“0”。其中用bit定义的位变量在C51编译器编译时,在不同的时候位地址是可以变化的。而用sbit定义的位变量必须与MCS-51单片机的一个可以寻址位单元或可位寻址的字节单元中的某一位联系在一起,在C51编译器编译时,其对应的位地址是不可变化的。
下表为KEIL C51编译器能够识别的基本数据类型
基本数据类型
长度
取值范围
Unsigned char
1字节
0~255
Signed char
1字节
-128~+127
Unsigned int
2字节
0~65535
Signed int
2字节
-32768~+32767
Unsigned long
4字节
0~4294967295
Signed long
4字节
-2147483648~+2147483637
float
4字节
±1.175494E-38~±3.402823E+38
bit
1
01
sbit
1
01
sfr
1字节
0~255
Sfr16
2字节
0~65535
C51语言程序中,有可能会出现在运算中数据类型不一致的情况。C51允许任何标准数据类型的隐式转换,隐式转换的优先顺级顺序如下:
Bit->char->int->long->float
signed->unsigned
也就是说,当char型与int弄进行运算时,选自动对char型扩展为int型,然后与int型进行运算,运算结果为int型。C51除了支持隐式类型转换外,还可以通过强制类型转换符“()”对数据类型进行人为的强制转换。
C51编译器除了能支持以上这些基本数据类型之外,还能支持一下结复杂的组合型数据类型,如数组类型、指针类型、结构类型和联合类型等复杂的数据类型。在本书的后面将相继介绍它们。
8、枚举
C51语言中,用作标志的变量通常只能被赋予如下两个值中的一个:True(1)False(0)
但是在编程中,常常会将作为标志使用的变量赋予除了True(1)False(0)以外的值。另外,标志变量通常被定义为int数据类型,在程序使用中作用往往会模糊不清。为避免这种情况,在C51语言中提供枚举类型处理这种情况。
枚举数据类型是一个有名字的某些整型常量的集合。这些整型常量是该类型变量可取的所有合法值。枚举定义时应当列出该类型变量的所有可取值。
浮点型变量float枚举定义的格式与结构和联合基本相同,也有两种方法。
先定义枚举类型,再定义枚举变量,格式如下:
enum  枚举名  {枚举值列表}
enum  枚举名  枚举变量列表;
或在定义枚举类型的同时定义枚举变量,格式如下:
enum  枚举名  {枚举值列表}  枚举变量列表;
例如:定义一个取值为星期几的枚举变量dl
enum  week  {Sun,Mon,Tue,Wed,Thu,Fri,Sat};
enum  week  dl;
enum  week  {Sun,Mon,Tue,Wed,Thu,Fri,Sat}  dl;
以后就可以把枚举值列表中各个值赋给枚举变量dl进行使用了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。