1、C 语言第四节一、 数据类型C 语言要求在定义所有的变量时都要指定变量的类型。常量也是区分类型的。问题:为什么在用计算机运算时,要指定数据的类型呢?在计算机中,数据是存放在存储单元中的,它是具体存在的(在数学中,数和数的运算都是抽象的) 。而且,存储单元是由有限的字节构成的,每一个存储单元中存放数据的范围是有限的,不可能存放“无穷大”的数,也不能存放循环小数。例:计算和输出 1/3:printf(“%f”,1.0/3.0);得到的结果是 0.333333,只能得到 6 位小数,而不是无穷位的小数。注意:用计算机进行的计算不是抽象的理论值的计算,而是用工程的方法实现的计算,在许多情况下只能得到近
2、似的结果。所谓类型,就是对数据分配存储单元的安排,包括存储单元的长度(占多少字节)以及数据的存储形式。不同的类型分配不同的长度和存储形式。不同类型的数据在内存中占用的存储单元长度是不同的,Visual C+6.0 为 char 型(字符型)数据分配 1 个字节,为 int 型( 基本整型)数据分配 4 个字节。在存储单元中的存储方式是:用整数的补码形式存放。一个正数的补码是此数的二进制形式,如 5 的二进制形式 101,如果用两个字节存放一个整数,则在存储单元中数据形式是:0000000000000101如果是一个负数,则应先求出负数的补码。求负数补码的方法是:先将此数的绝对值写成二进制形式,
3、然后对其所有各二进位按位取反,再加一。数据类型基本类型派生类型整型类型浮点类型基本整型(int)短整型 (short int)长整型(long int)字符型(char)单精度浮点型(float)双精度浮点型(double)枚举类型(enum)空类型(void)指针类型(*)数组类型()结构体类型(struct)函数类型-5 的补码:5 的原码:0000000000000101按位取反:1111111111111010再加一: 1111111111111011 (在存放整数的存储单元中,最左面一位是用来表示符号的,如果该位为 0,表示数值为正;如果该位为 1,表示数值为负。 )1. 整型数据的
4、分类1) 基本整型(int)编译系统分配给 int 整形数据 2 个字节或 4 个字节( 由 C 编译系统决定)。2) 短整型(short int)类型名为 short int 或 short。用 Visual C+6.0,编译系统分配给 int 数据 4 个字节,短整型 2 个字节。3) 长整型(long int)类型名为 long int 或 long。一个 long int 型变量的值的范围是-2 31(2 31-1) ,即-21474836482147483647(Visual C+ 6.0),编译系统分配给 long 数据 4 个字节。2. 字符型数据1) 字符与字符代码字符与字符代
5、码并不是任意写一个字符,系统都能识别的。例如圆周率 在程序中是不能识别的,只能使用系统的字符集中的字符,目前大多数系统采用 ASCII 字符集。基本包括 127 个字符:字母:大写英文字母 AZ,小写英文字母 az。数字:09。专门符号:29 个: !” # ? _ | 空格符:不能显示的字符:空(null)字符(0表示) 、警告(以a表示) 、退格(以b表示) 、回车(以r表示)等。前已说明,字符是以整数形式(字符的 ASCII 代码)存放在内存单元中的。例:大写字母A的 ASCII 代码是十进制数 65,二进制形式为 1000001小写字母a的 ASCII 代码是十进制数 97,二进制形式
6、为 1100001数字字符1的 ASCII 代码是十进制数 49,二进制形式为 0110001可以看到,以上的字符的 ASCII 代号码最多用 7 个二进制位既可以表示。所有 127 个字符都可以用 7 个二进位表示(ASCII 代码为 127 时,二进制形式为 1111111,7 位全是 1)。所以在 C 中,指定一个字节(8 位)存储一个字符。此时,字节中第一位置为 0。如小写字母a在内存中的存储情况是 01100001。注意:字符1和整数 1 是不同的概念,字符1只是代表一个形状为 1的符号,在需要时按原样输出,在内存中以 ASCII 码形式存储,占 1 个字节,而整数 1是以整数存储方
7、式(二进制补码方式 )存储的,占 2 个或者 4 个字符。整数运算1+1 等于 2,而字符1+1 并不等于整数 2 或字符2 而是 b。2) 字符变量字符常量是用类型符 char 定义字符变量。如:char c = ?定义 c 为字符型变量并使初值为?。 ?的 ASCII 代码是 63,系统把整数 63 赋给变量 c。可以把 0127 之间的整数赋给一个字符变量。3) 浮点型数据浮点型数据是用来表示具有小数点的实数的。为什么在 C 中把实数成为浮点数呢?在 C 语言中,实数是以指数形式存放在存储单元中的。一个实数表示为指数。可以有不止一种形式,如 3.1416 可以表示为:3.1416100,
8、0.31416101,0.031416102,31.41610-1 等,它们代表同一个值。可以看到:小数点的位置是可以在 31416 中来回浮动的,只要在小数点位置浮动的同时改变指数的值,就可以保证它的值不会改变。由于小数点位置可以浮动,所以实数的指数形式成为浮点数。浮点数类型包括 float(单精度浮点型) 、double( 双精度浮点型 )、long double(长双精度浮点型)。a) float 型。编译系统为每一个 float 型变量分配 4 个字节,存储时,系统将实型数据分成小数部分和指数部分两个部分,分别存放。float 型数据能得到 6 位有效数字,数值范围为-3.410 -3
9、83.41038。数值在 3 个范围内:-3.410 38 到-1.210 -38;0;1.2 10-38 到 3.41038b) double 型。为了扩大表示的数值范围,用 8 个字节存储一个 double 型数据,可以得到 15 位有效数字,数值范围-1.710 -3081.710308。在 C 语言中进行浮点数的算术运算时,将 float 型数据都自动转换为 double 型,然后进行计算。c) long double 型。分配 16 个字节。确定常量的类型整型常量:不带小数点的数值是整型常量,在 Visual C+中,int 和 long int 都分配 4个字节,没有必要用 lon
10、g int。浮点型常量:凡是以小数形式或指数形式出现的实数,都是浮点型常量,在内存中以指数形式存储。二、 运算符和表达式1. 基本的算术运算符+ 加法运算符- 减法运算符* 乘法运算符/ 除法运算符% 取余运算符两个实数相除的结果是双精度实数,两个整数相除的结果是整数。但是,如果除数或被除数中有一个为负值,则舍入的方向是不固定的。如:-5/3,有的系统得到的结果为-1 ,有的是-2 。 VC 采取“向零取整”的方法,即 5/3=1,-5/3=-1,取整后向零靠拢。%运算符要求参加运算要求参加运算的运算对象为整数,结果也是整数。如8%3,结果为 2。除%以外的运算符的操作数都可以是任何算术类型。
11、2. 自增、自减运算符作用是使变量的值加 1 或减 1,例如:+i,- -i(在使用 i 之前,先使 i 的值加(减)1)i+,i - -(在使用 i 之后,使 i 的值加(减)1)注意:自增运算符(+)和自减运算符(- -)只能用于变量,而不能用于常量或表达式,如 5+或(a+b)+ 都是不合法的。因为 5 是常量,常量的值不能改变。 (a+b)+也不可能实现,假如 a+b 的值为 5,那么自增得到的 6 无变量可供存放。3. 不同类型数据间的混合运算如果一个运算符的两侧的数据类型不同,则先自动进行类型转换,使二者具有同一种类型,然后进行运算。因此整型、实型、字符型数据间可以进行混合运算。规
12、律为:+、-、*、 /运算的两个数中有一个数位 float 或 double 型,结果是 double 型。如果 int 型与 float 或 double 型数据进行运算,先把 int 型和 float 型数据转换为 double型,然后进行运算,结果为 double 型。字符(char)型数据与整型数据进行运算,就是把字符的 ASCII 代码与整形数据进行运算。字符数据可以直接与整型数据进行运算。如果字符型数据与实型数据进行运算,则将字符的 ASCII 代码转换为 double 型数据,然后进行运算。例 1:给定一个大写字母,要求用小写字母输出。#include void main()ch
13、ar a,b;printf(“请输入一个大写字母:”);scanf(“%c”,a);b = a + 32;printf(“大写字母是:%c,小写字母是:%c”,a,b);4. 强制类型转换运算符可以利用强制类型转换运算符将一个表达式转换成所需类型。例如:(double) a (将 a 转换成 double 类型)(int) (x+y) (将 x+y 的值转换成 int 型)(float) (5%3) (将 5%3 的值转换成 float 型)其一般形式为(类型名) (表达式)注意,表达式应该用括号起来。如果写成 (int) x+y 则只将 x 转换成整型,然后与 y 相加。需要说明的是,在强制
14、类型转换时,得到一个所需类型的中间数据,而原来变量的类型未发生变化。例如:float x;int a;a = (int) x如果已定义 x 为 float 型变量,a 为整型变量,进行强制类型运算(int) x 后得到一个 int 类型的临时值,它的值等于 x 的整数部分,把它赋给 a,注意 x 的值的类型都未变化,仍为 float 型。该临时值在赋值后就不再存在了。两种类型转换:一种是在运算时不必用户干预,系统自动进行的类型转换一种强制类型转换,当自动类型转换不能实现目的时,可以用强制类型转换。如:% 运算符要求两侧均为整型量,若 x 为 float 型,则 x%3 不合法,必须用(int) x %3练习题:求方程 02cbxa的根(设 ) (其中 a,b,c 的042acb值由键盘输入) 。#include#includemain()float a, b, c, dt, x1, x2;scanf(“%f%f%f”, dt=sqrt(b*b-4*a*c);x1=(-b+dt)/(2*a);x2=(-b-dt)/(2*a);printf(“x1=%5.2f, x2 =%5.2f”, x1, x2);