第二章 基本数据类型
2.1 程序设计概述
2.2 C语言的数据类型
2.3 常量和变量
2.4 整型数据
2.5 实型数据
2.6 字符型数据
2.7 各类数值数据之间的混合运算
2.1 程序设计概述
一个程序应包括对数据的描述和对数据处理的描述。
1.对数据的描述,即数据结构。数据结构是计算机学
科的核心课程之一,有许多专门著作论述,本课程就不再
赘述。
在 C语言中,系统提供的数据结构,是以数据类型的形
式出现的。
2.对数据处理的描述,即计算机算法。算法是为解决
一个问题而采取的方法和步骤,是程序的灵魂。为此,著
名计算机科学家沃思( Nikiklaus Wirth)提出一个公式:
数据结构 + 算法 = 程序
实际上,一个程序除了数据结构和算法外,还必须使
用一种计算机语言,并采用结构化方法来表示。
2.2 C语言的数据类型
C语言提供的数据结构, 是以数据类型形式出现的 。 具体
分类如下:
1.基本类型
分为整型, 实型 ( 又称浮点型 ), 字符型和枚举型四种 。
2.构造类型
分为数组类型, 结构类型和共用类型三种 。
3.指针类型 。 在第 10章中介绍 。
4.空类型
C语言中的数据, 有常量和变量之分, 它们分别属于上述
这些类型 。
本章将介绍基本类型中的整型, 实型和字符型三种数据 。
2.3 常量与变量
2.3.1 常量
1.常量的概念
在程序运行过程中,其值不能被改变的量称为常量。
常量可以从字面形式即可判断 -字面常量或直接常量。
2.常量的分类
( 1)整型常量(如 12,0,-3为整型常量)
( 2)实型常量( 4.6,-1.23为实型常 量)
( 3)字符常量( ’ a?、’ d?字符常量)
( 4)符号常量。
1,符号常量:有时为了使程序更加清晰和便于修改, 用一个标识符
来代表常量, 即给某个常量取个有意义的名字, 这种常量称为符号常量 。
#define PI 3.1416
使用符号常量的好处:
( 1) 含义清楚, 见名知意 。
( 2) 修改方便, 一改全改 。
例:符号常量应用
#define PI 3.14
main()
{
float area;
area=10*10*PI;
printf("area=%f\n",area);
}
结果,area=314.000000
2.3.2 变量
1.变量的概念
在程序运行过程中, 其值可以被改变的量称为变量 。
2.变量的两个要素
( 1) 变量名 。 每个变量都必须有一个名字 ──变量名, 变量命
名遵循标识符命名规则 。
( 2) 变量值 。 在程序运行过程中, 变量值存储在内存中 。 在
程序中, 通过变量名来引用变量的值 。
C语言中变量:, 先定义, 后使用, 。 即就是说, C要求对所有
用到的变量做强制定义 。
3,标识符命名规则 ( 再次复习一下上一节课的内容 )
( 1) 有效字符:只能由字母, 数字和下划线组成, 且以字母
或下划线开头 。
( 2) 有效长度:随系统而异, 但至少前8个字符有效 。 如果
超长, 则超长部分被舍弃 。
例如, 由于 student_name和 student_number的前8个字符相同,
有的系统认为这两个变量, 是一回事而不加区别 。
在 TC V2.0中, 变量名 ( 标识符 ) 的有效长度为1~32个字
符, 缺省值为32 。
( 3) C语言的关键字不能用作变量名 。
注意,C语言对英文字母的大小敏感, 即同一字母的大
小写, 被认为是两个不同的字符 。
习惯上, 变量名和函数名中的英文字母用小写, 以增加
可读性 。
思考题:在 C语言中, 变量名 total与变量名 TOTAL、
ToTaL,tOtAl等是同一个变量吗?
标识符命名的良好习惯 ──见名知意,
所谓, 见名知意, 是指, 通过变量名就知道变量值的含
义 。 通常应选择能表示数据含义的英文单词 ( 或缩写 ) 作变
量名, 或汉语拼音字头作变量名 。
例如, name/xm( 姓名 ), sex/xb( 性别 ), age/nl( 年
龄 ), salary/gz( 工资 ) 。
2.4 整型数据
2.4.1 整型变量
1.分类
根据占用内存字节数的不同,整型变量又分为4类:
( 1)基本整型(类型关键字为 int)。
( 2)短整型(类型关键字为 short [int])。
( 3)长整型(类型关键字为 long [int])。
( 4)无符号整型。无符号型又分为无符号基本整型
( unsigned [int])、无符号短整型( unsigned short)和无
符号长整型( unsigned long)三种,只能用来存储无符号
整数。
2.占用内存字节数与值域
上述各类型整型变量占用的内存字节数,随系统而异。
在 16位操作系统中,一般用2字节表示一个 int型变量,且
long型(4字节) >int型(2字节) ≥short型(2字节)。
显然,不同类型的整型变量,其值域不同。占用内存字
节数为 n的(有符号)整型变量,其值域为,-2n*8-1~( 2n*8-1-
1);无符号整型变量的值域为,0~( 2n*8-1)。
例如,PC机中的一个 int型变量,其值域为 -22*8-1~( 22*8-
1-1),即 -32768~32767;一个 unsigned型变量的值域为,0~
( 22*8-1),即 0~65535。 (看书上 p12表 2- 1)
2.整型变量的说明
变量说明的一般形式为:
类型说明符 变量名标识符,变量名标识符,...; 例如:
int a,b,c; (a,b,c为整型变量 )
long x,y; (x,y为长整型变量 )
unsigned p,q; (p,q为无符号整型变量 )
在书写变量说明时,应注意以下几点 (看 p12)
看书上例题 p13。
2.4.2 整型常量
1,三种表示形式
整型常量即整常数, 在C语言中可用三种形式表示:
( 1) 十进制 ( 数码取值,0~ 9) 。 例如 10,36。
( 2) 八进制 ( 以数字0开头, 数码取值,0~7) 。
例如 012。
( 3) 十六进制 ( 以数字0 +小 /大写字母 x开头, 数码取
值,A~F或 a~f) 。 例如 0x36,0X5A。
课堂练习:判断以下常量是否合法?
9A,0X6G,029,等等
整型常数的后缀 (看书上 p11)
类型匹配规则为:一个整型常量, 可以赋给能容纳下
其值的整型变量 。
例如, 其值在 -2 15 --( 2 15 -1 ) 的整型常量, 可以
赋给 int型变量和 long int型变量;其值在 -2 31 --( 2 31 -1 )
的整型常量, 就只能赋给 long int型变量 。
2.5 实型数据
2,5,1实型常量的表示方法
实型 ( 浮点型 ) 有两种表示形式:
1,十进制小数形式 。 由数字 0~ 9和小数点组成 ( 必须有小数点 ) 。
例如,.123,123.,123.0,0.0
2,指数形式 。 格式,aEn。 ( a:十进制数 n:阶码 ( 只能为整数, 可以
带符号 )) 例如,123e3,123E3都是实数的合法表示 。
注意:
1) 字母 e或 E之前必须有数字, e后面的指数必须为整数 。
例如,e3,2.1e3.5,.e3,e都不是合法的指数形式 。
2) 规范化的指数形式 。 在字母 e或 E之前的小数部分, 小数点左边应当有
且只 能有一位非 0数字 。 用指数形式输出时, 是按规范化的指数形式输出的 。
例如,2.3478e2,3.0999E5,6.46832e12都属于规范化的指数形式 。
3) 实型常量都是双精度, 如果要指定它为单精度, 可以加后缀 f( 实型数
据类型参看实型变量部分说明 ) 。
2,5,2实型变量
1,实型数据在内存中的存放形式,一个实型数据一般在内存中占 4个字节
( 32位 ) 。
? 1,实型变量的分类
? 实型变量分为:单精度 (float),双精度 (double) 。
? 单精度:其类型说明符为 float 单精度说明符
? 双精度,double 双精度说明符。在 Turbo C中单精度型占 4个
字节( 32位)内存空间,其数值范围为 3.4E-38~ 3.4E+38,
只能提供七位有效数字。双精度型占 8 个字节( 64位)内存
空间,其数值范围为 1.7E-308~ 1.7E+308,可提供 16位有效
数字。
实型变量说明的格式和书写规则与整型相同。
类型说明符 变量名标识符,变量名标识符,...
? 例如,float x,y; (x,y为单精度实型量 )
double a,b,c; (a,b,c为双精度实型量 )
说明,1、实型常数不分单、双精度,都按双精度 double型处
理。
2、实型常量可以赋值给一个 float,double,long double型变
量。根据变量的类型截取实型常量中相应的有效数字。
? 例题( p14 例 2-3,p14 例 2-4)
2.6 字符型数据
2.6.1 字符常量
1.字符常量的定义
用一对单引号括起来的单个字符,称为字符常量。例如,‘ A?、
‘1’、‘+’等。字符常量的特点:
1.字符常量只能用单引号括起来,不能用双引号或其它括号。
2.字符常量只能是单个字符,不能是字符串。
3.字符可以是字符集中任意字符。但数字被定义为字符型之后就
不能参与数值运算。如 '5'和 5 是不同的。 '5'是字符常量,不能参与运
算。
2.转义字符
C语言还允许使用一种特殊形式的字符常量,就是以反斜杠,\”
开头的转义字符。
看书上表 p15(表 2- 2)
注意:如果反斜杠或单引号本身作为字符常量,必须使用转
义字符:‘ \\?、‘ \??。分析书上例题( p15-16)
2.6.2 字符变量
字符变量的类型关键字为 char,一般占用 1字节
内存单元。
1.变量值的存储
字符变量用来存储字符常量。将一个字符常量
存储到一个字符变量中,实际上是将该字符的
ASCII码值(无符号整数)存储到内存单元中。
例如,
char ch1,ch2; /*定义两个字符变量,ch1,
ch2*/
ch1=?a?; ch2=?b?; /*给字符变量赋值 */
2.特性
字符数据在内存中存储的是字符的 ASCII码 ── 一个无
符号整数,其形式与整数的存储形式一样,所以C语言允
许字符型数据与整型数据之间通用。
( 1)一个字符型数据,既可以字符形式输出,也可以
整数形式输出。
[案例 ] 字符变量的字符形式输出和整数形式输出 。
/*程序功能:用字符形式和整数形式输出字符变量 */
main()
{ char ch1,ch2;
ch1='a'; ch2='b';
printf(“ch1=%c,ch2=%c \n”,ch1,ch2);
printf(“ch1=%d,ch2=%d \n”,ch1,ch2);
}
程序运行结果:
ch1=a,ch2=b
ch1=97,ch2=98 [程序演示 ]
( 2)允许对字符数据进行算术运算,此时就
是对它们的 ASCII码值进行算术运算。
[案例 ] 字符数据的算术运算。
/*程序功能:字符数据的算术运算 */
main()
{ char ch1,ch2;
ch1=?a?; ch2=?B?;
/*字母的大小写转换 */
printf(“ch1=%c,ch2=%c \n”,ch1-32,ch2+32);
printf(“ch1=%d,ch2=%d \n”,ch1-32,ch2+32);
}
2.5.4 字符串常量
1.字符串常量的概念和字符串长度
字符串常量是用一对双引号括起来的若干字
符序列。
字符串中字符的个数称为字符串长度。长度
为 0的字符串(即一个字符都没有的字符串)称
为空串,表示为,” (一对紧连的双引号)。
例如,,How do you do.”、,Good morning.”等,
都是字符串常量,其长度分别为 14和 13(空格也是一个
字符)。
如果反斜杠和双引号作为字符串中的有效字符,则
必须使用转义字符。
例如:( 1) C:\msdos\v6.22 → "C,\\msdos\\v6.22"
( 2) I say:"Goodbye!" → "I say,\"Goodbye!\"“
2.字符串的存储
C语言规定:在存储字符串常量时,由系统在字符串
的末尾自动加一个‘ \0?作为字符串的结束标志。
注意:在源程序中书写字符串常量时,不必加结束
字符‘ \0?,否则画蛇添足。
如果有一个字符串为,CHINA”,则它在内存中的
实际存储如下所示:
最后一个字符 '\0'是系统自动加上的,它占用6字节
而非5字节内存空间。
C H I N A \0
综上所述, 字符常量 'A'与字符串常量 "A"是两回事:
( 1) 定界符不同:字符常量使用单引号, 而字符串常量
使用双引号;
(2)字符常量只能是单个字符, 字符串常量则可以含一个或
多个字符 。
( 3) 可以把一个字符常量赋予一个字符变量, 但不能把
一个字符串常量赋予一个字符变量 。
( 4) 字符常量占一个字节的内存空间 。 字符串常量占的
内存字节数等于字符串中字符数加 1。 增加的一个字节存放字
符 ‘ \0?(ASCII值为 0),这是字符串的结束标志 。
2.7数据类型转换
( 1) 在C语言中, 整型, 实型和字符型数据间可以
混合运算 ( 因为字符数据与整型数据可以通用 ) 。
如果一个运算符两侧的操作数的数据类型不同, 则
系统按, 先转换, 后运算, 的原则, 转换的方法有两种:
自动转换 ( 隐式转换 ) ;强制转换 。
1,自动动转换 ( 隐式转换 )
自动转换发生在不同类型数据进行混合运算时, 由
编译系统自动完成 。 转换规则,( 参看下页图示 )
( 1) 类型不同, 先转换为同一类型, 然后进行运算 。
( 2) 图中纵向的箭头表示当 运算对象为不同类型时
转换的方向 。 可以看到箭头由低级别数据类型指向高级
别数据类型, 即 数据总是由低级别向高级别转换 。 即按
数据长度增加的方向进行, 保证精度不降低 。
( 3) 图中 横向向左的箭头表示必定的转换 ( 不必考虑
其它运算对象 ) 。 如字符数据参与运算必定转化为整数,
float型数据在运算时一律先转换为双精度型, 以提高运
算精度 ( 即使是两个 float型数据相加, 也先都转换为
double型, 然后再相加 ) 。
( 4) 赋值运算, 如果赋值号, =”两边的数据类型不同,
赋值号右边的类型转换为左边的类型 。 这种转换是截断
型的转换, 不会四舍五入 。 ( 教材 P19倒数 18行, 四舍
五入, 有异议? )
? 例子:教材 P19。 算式 。 ( 自学 )
? 2,强制转换
? 强制转换是通过类型转换运算来实现 。
? 一般形式,( 类型说明符 ) 表达式
? 功能:把表达式的结果强制转换为类型说明符所表示
的类型 。
? 例如:
? (int)a 将 a的结果强制转换为整型量 。
? (int)(x+y) 将 x+y的结果强制转换为整型量 。
? (float)a+b 将 a的内容强制转换为浮点数,再与 b相加
? 说明:
? ( 1) 类型说明和表达式都需要加括号 ( 单个变量可
以不加括号 )
? ( 2) 无论隐式转换, 强制转换都是临时转换, 不改
变数据本身的类型和值 。
? 例 2-9:强制类型转换 (P.20)
? main()
? {
? float f=5.75;
? printf("(int)f=%d\n",(int)f); /* 将 f的结果强制
转换为整型, 输出 */
? printf("f=%f\n",f); /* 输出 f的值 */
? }
? 结果:
? (int)f=5
? f=5.750000
?