第2章 数据类型与运算符(3)

2020-02-21 22:45

博学谷——让IT教学更简单,让IT学习更有效

短整型整型整型长整型基本数据类型实型(浮点型)字符型枚举型数据类型构造类型指针类型空类型图2-6 C语言的数据类型

从图2-6中可以看出,C语言中的数据类型可分为4种,分别是基本类型、构造类型、指针类型、空类型。接下来将针对基本数据类型进行详细地讲解,关于其他数据类型将在后面章节中讲解。

1、整型变量

在程序开发中,经常会遇到0、-100、1024等数字,这些数字都可称为整型。整型就是一个不包含小数部分的数。在C语言中,根据数值的取值范围,可以将整型定义为短整型(short int)、基本整型(int)和长整型(long int)。表2-7中列举了整数类型的长度及其取值范围。

表2-7

修饰符 数据类型 short [int] [signed] int long [int] short [int] unsigned int long [int] 占用空间 16位(2个字节) 32位(4个字节) 32位(4个字节) 16位(2个字节) 32位(4个字节) 32位(4个字节) 整数类型的长度及其取值范围

取值范围 -32768到32767 (-215 ~ 215-1) -2147483648到2147483647 (-231 ~ 231-1) -2147483648到2147483647 (-231 ~ 231-1) 0到65535 (0 ~ 216-1) 0到4294967295 (0 ~ 232-1) 0到4294967295 (0 ~ 232-1) 单精度型双精度型数组类型结构体类型共用体类型

从表2-7中可以看出,整数类型可分为short、int和long,这三种类型可以被signed和unsigned修饰。其中,被signed修饰的整数类型称为有符号的整数类型,被unsigned修饰的称为无符号的整数类型。它们之间最大的区别是无符号类型可以存放的正数范围比有符号类型中的范围大一倍,例如,int的取值范围是-231~231-1,而unsigned int的取值范围是0~232-1。默认情况下,整型数据都是有符号的,此时signed修饰符可以不用写。

需要注意的是,整型数据在内存中占的字节数与所选择的操作系统有关。虽然C语言标准中没有明确规定整型数据的长度,但long类型整数的长度不能短于int类型,int类型整数的长度不能短于short类型。

通过对表2-7的学习,我们了解了不同整数类型数据的取值范围,这些数据类型的极值在头文件stdlib.h中都有宏定义,可以将它们打印出来,如例2-2所示。

例2-2

1 #include 2 #include

11

博学谷——让IT教学更简单,让IT学习更有效

3 void main() 4 { 5 6 7 8 9 10 11 12 }

printf(\%d——%d\\n\printf(\

%d——%d\\n\

printf(\%d——%d\\n\

printf(\%u\\n\是无符号整数输出格式 printf(\system(\

%u\\n\

printf(\%u\\n\

运行结果如图2-7所示。

图2-7 运行结果

在图2-7中可以看出,将short、int、long的有符号与无符号极值都打印出来,与表2-6的一致。关于宏定义的相关知识,将在第8章详细讲解,这里同学们只需了解这些不同的宏定义对应着不同数据类型的极值即可。

?多学一招:计算机的数据单位

位(bit):电子计算机中最小的数据单位,每一位的状态只能是0或1。

字节(byte):8个二进制位构成1个字节,它是存储空间的基本计量单位。1个字节可以储存1个英文字母或者半个汉字,换句话说,1个汉字占据2个字节的存储空间。

KB:在一般的计量单位中,通常K表示1000,例如:1公里=1000米,经常被写为1km;1公斤=1000克,写为1kg。同样K在二进制中也有类似的含义,只是这时K表示1024,也就是2的10次方。1KB表示1K个Byte,也就是1024个字节。

MB:计量单位中的M(兆)是10的6次方,见到M自然想起要在该数值的后边续上六个0,即扩大一百万倍。在二进制中,MB也表示到了百万级的数量级,但1MB不正好等于1000000字节,而是1048576字节,即 1MB = 2E+20 Bytes = 1048576Bytes,也就是1024KB。

GB:比MB更大的单位,1GB=1024MB=220KB=230B。 TB:比GB更大的单位,1TB=1024GB。 2、实型变量

实型变量也可以称为浮点型变量,浮点型变量是用来存储小数数值的。在C语言中,浮点型变量分为两种:单精度浮点数(float)、双精度浮点数(double),但是double型变量所表示的浮点数比float型变量更精确。表2-8列举了两种不同浮点型数所占用的存储空间大小及取值范围。

表2-8

类型名 float double 占用空间 浮点类型长度及其取值范围

取值范围 32位(4个字节) 1.4E-45 ~ 3.4E+38,-1.4E-45 ~ -3.4E+38 64位(8个字节) 4.9E-324 ~ 1.7E+308, -4.9E-324 ~ -1.7E+308 表2-8中列出了两种浮点数类型变量所占的空间大小和取值范围。在取值范围中,E表示以10为底的指数,E后面的“+”号和“-”号代表正指数和负指数,例如,1.4E-45表示1.4*10-45。为了让读者更好地理解浮点型数据在内存中的存储方式,接下来以单精度浮点数3.14159为例进行详细讲解,如图2-8所示。

12

博学谷——让IT教学更简单,让IT学习更有效

图2-8 单精度浮点数存储方式

在图2-8中,浮点数包含符号位、小数位和指数位三部分,例如,小数3.14159在内存中的符号位为“+”,小数部分为.314159,指数位为1,连接在一起即为“+0.314159 * 101 = 3.14159”。

在C语言中,一个小数会被默认为double类型的值,在为一个float类型变量赋值时可以在后面加上字母“F”(或者小写“f”),double类型变量后加上“D”(或者小写“d”)来加以区分。但C语言在为变量赋值时可以自动转换类型,所以后缀可以省略,具体示例如下:

float f = 123.4f;

// 为一个float类型的变量赋值,后面可以加上字母f

// 为一个double类型的变量赋值,后面可以加上字母d

double d2 = 199.3d;

另外,在程序中也可以为一个浮点数类型变量赋予一个整数数值,示例如下:

float f = 100; double d = 100;

// 声明一个float类型的变量并赋整数值

// 声明一个double类型的变量并赋整数值

?脚下留心:float和double精确度

由于浮点型变量是由有限的存储单元组成的,因此只能提供有限的有效数字。在有效位以外的数字将不精确。双精度浮点数的有效位数更多,比单精度浮点数更能精确表达数据,它能提供15-16位有效位数,而单精度浮点数只能提供6-7位有效位数。例如,将1.12345678910111213赋给一个float型变量和dobule类型变量,其有效位数不同。如例2-3所示。

例2-3

1 #include 2 void main() 3 { 4 5 6 7 }

float f = 1.12345678910111213; double d = 1.12345678910111213;

printf(\是打印到小数点后17位

运行结果如图2-9所示。

图2-9 运行结果

从图2-9中可以看出,float类型的f变量精确到小数点后6位,double类型的d精确到小数点后15位,其后的数进行了四舍五入。 3、字符型变量

字符型变量用于存储一个单一字符,在C语言中用char表示,其中每个字符变量都会占用1个字节。在给字符型变量赋值时,需要用一对英文半角格式的单引号(' ')把字符括起来,例如,'A'的声明方式如下所示:

char ch = 'A'; // 为一个char类型的变量赋值字符'a'

上述代码中,将字符常量“A”放到字符变量ch中,实际上并不是把该字符本身放到变量的内存单元中去,而是将该字符对应的ASCII编码放到变量的存储单元中,例如:ASCII 使用编号 65 来对应大写字母“A”,因此变量ch存储的是整数65,而不是字母“A”本身。接下来通过一个案例来说明字符变量如何存放字符常量,如例2-4所示。

例2-4

1 #include 2 void main() 3 {

13

博学谷——让IT教学更简单,让IT学习更有效

4 char ch1 = 'A'; 5 char ch2 = 65; 6 printf(\ 7 printf(\ 8 }

运行结果如图2-10所示。

图2-10 ASCII字符

例2-4中,定义了两个char类型变量,分别赋值为字符“A”和数字65,然后通过printf()函数把两个变量的内容以字符形式打印到屏幕上。从图2-10中可以看出,两个变量输出的结果是一样的,这说明对于字符型来说,A和65其实没什么区别。严格来说,字符类型也是整型类型。

需要注意的是,除了可以直接从键盘上输入的字符(如英文字母,标点符号,数字,数学运算符等)以外,还有一些字符是无法用键盘直接输入的,比如,“回车”,此时需要采用一种新的定义方式——转义字符,它以反斜杠(\\)开头,随后接特定的字符。

接下来,通过一个具体的案例来演示转义符的用法,如例2-5所示。 例2-5

1 #include 2 void main() 3 {

4 char ch1 = 'A'; 5 char ch2 = '\\n'; 6 char ch3 = 'B'; 7 char ch4 = '\\\\'; 8 printf(\ 9 printf(\ 10 printf(\ 11 printf(\ 12 printf(\ 13 }

运行结果如图2-11所示。

图2-11 ASCII字符的输出结果

在例2-5中定义了四个字符型变量,其中ch2被赋值为转义字符“\\n”即换行符,ch4被赋值为转义字符“\\\\”即反斜杠。从第8行到第11行按照顺序分别将五个变量的值输出到屏幕上,我们会发现输出字符A之后另起一行输出字符B,转义字符“\\n”的作用就是控制输出结果另起一行;字符B后输出的是字符“\\”。第12行为了使输出结果的格式清晰一些又输出了一个换行符,防止程序结束后命令行提示符紧跟在输出结果的后面。

4、枚举类型变量

在日常生活中有许多对象的值是有限的,可以一一列举出来。例如一个星期内只有七天、一年只有十二个月等等。如果把这些量说明为整型,字符型或其它类型显然是不妥当的。为此,C语言提供了一种称为“枚举”的类型。枚举类型就是其值可以被一一列举出来,并且变量的取值不能超过定义的范围。

枚举类型的声明方式比较特殊,具体格式如下:

enum 枚举名 {标识符1 = 整型常量1, 标识符2 = 整型常量2, ...};

在上述代码中,enum表示声明枚举的关键字,枚举名表示枚举对象的名称。为了让读者更好的理解枚举类型的使用,接下来通过定义一个枚举类型来进行详细讲解。示例如下:

14

博学谷——让IT教学更简单,让IT学习更有效

enum month { JAN=1, FEB=2, MAR=3, APR=4, MAY=5, JUN=6, JUL=7, AUG=8, SEP=9, OCT=10, NOV=11, DEC=12 };

上面的代码中,声明了一个枚举类型对象month,然后就可以使用此类型来定义变量。接下来,通过一个具体案例来学习枚举的具体用法,如例 2-6 所示。

例2-6

1 #include

2 enum month {JAN=1, FEB=2, MAR=3, APR=4, MAY=5, JUN=6, 3 JUL=7, AUG=8, SEP=9, OCT=10, NOV=11, DEC=12}; 4 void main() 5 {

6 enum month lastmonth, thismonth, nextmonth; 7 lastmonth = APR; 8 thismonth = MAY; 9 nextmonth = JUN;

10 printf(\ 11 }

运行结果如图2-12所示。

图2-12 运行结果

在例2-6中,第2行代码定义了一个枚举类型,其中,枚举名month是一个标识符,大括号中的内容被称为枚举值表;枚举值表内的标识符JAN、FEB、MAR等被称作枚举元素,枚举元素是被命名的整型常量,枚举值表中罗列出所有可用值,枚举成员对应的值是枚举值,枚举类型的定义以分号结束。第6行定义了三个枚举变量,在后面的代码中分别进行了赋值,最后依次将这三个枚举变量的值输出到显示器。可以看出输出结果为枚举元素对应的值。

需要注意的是,枚举值是常量,不是变量,在程序中不能赋值。例如在主函数中,对MAR再次赋值是错误的。

?多学一招:枚举变量的快速定义

在枚举中规定,如果不给标识符指定具体的值,会默认该标识符的值等于前一标识符的值加1。因此可以将上面的定义简化成:

enum month{JAN=1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC};

如果不指定第一个标识符对应的常量,则它的默认值是0,如例2-7所示。 例2-7

1 #include 2 // 定义一组常量

3 enum Constants {C1, C2, C3 = 4, C4, C5 = 3, C6, C7, C8 = '0', C9}; 4 void main() 5 { 6 7 }

printf(\

运行结果如图2-13所示。

图2-13 运行结果

在例2-7中,首先用枚举定义了一组常量C1到C9,并向显示器输出常量C1的数值。作为读者,在编译和运行该例程之前,最好先试着猜测C1到C9这九个常量的数值。

15


第2章 数据类型与运算符(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:提高守法意识 预防职务犯罪-农村基层组织人员职务犯罪预防警示教

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: