C语言的数据类型有许多种,例如字符、整数、长整数、浮点数或是双倍精度浮点数。数据类型的转换类似倒水,如果将小杯的水倒入大杯中,水不会流失;如果将大杯的水倒入小杯中,水会流失。例如,可以想象整数是小杯的水,浮点数是大杯的水。
假设a是整数,值是2,将a转换成浮点数后值变成2.0,整体看数据是有保留。假设b是浮点数,值是2.5,将b转换成整数后值变成2,这时数据会有流失。
在程序设计中,会依据需要做上述数据形态的转换。
在设计C语言程序时,时常会面对不同变量数据形态之间的运算。例如,将某一浮点数和某一整数相加,碰上这种情形时,C编译程序会主动将整数转换成浮点数来运算。
实例1: 有一C语言指令如下:
s=a+b;
假设执行指令前,a是整数,a=3;b是浮点数,b=2.5;s是浮点数,s=2.0。
则在运算完成后,s=5.5,a=3,b=2.5。
实例2: 有一C语言指令如下:
s=a+b;
假设a是整数,a=3;b是浮点数,b=2.5;s是整数,s=2。
由于s是整数,所以尽管a+b=5.5,但s只能存储整数,所以最后结果s=5。
程序实例 ch2_9.c:数据形态的转换实例。
实例3: 有一C语言指令如下:
s=a / b;
假设执行指令前,a、b都是整数,s则是浮点数,其中a=3,b=2,s=1.0。
执行指令时,计算机会先执行整数相除,所以a / b的结果是1,然后将1存入s值内,因为s是浮点数,所以执行结果s值是1.0。
从以上运算可知,若不是一位很熟悉C语言的程序设计员,可能会被不同操作数形态的运算搞得有一点头疼。所以设计程序时,最好的方法是尽量避免不同形态的操作数在同一指令中出现。
当无法避免不同形态的操作数在同一指令中时,C语言提供了另一个功能可克服上面问题,那就是更改数据形态。使用时,只要在某个变量前加上括号,然后在括号中指明操作数形态即可。例如,若想将上述实例a和b强制改成浮点数,则可以将上述表达式改成:
s=( float) a / ( float) b;
此时计算机在执行时会先将a改成3.0,b改成2.0,所以运算完成后s的值是1.5。
另外,如果是进行整数值相除,假设指令如下:
s=3 / 2;
上述执行结果是1,假设s是浮点数,我们期待获得浮点数1.5的除法结果,可以将上述指令改为下列方式之一,即可以获得正确的浮点数结果。
s=3.0 / 2.0;
或
s=3 / 2.0;
或
s=3.0 / 2;
程序实例 ch2_10.c:数据形态的转换实例。
注 上述第12行的printf( )函数内的输出格式“%3.2f”,是设定输出的浮点数整数有3位数,其中小数部分有2位数。
实例4: 有一C语言指令如下:
s=(int) a / (int) b;
假设a和b是浮点数,a=4.6,b=2.1,s是整数,s=10。
执行指令时,由于C语言会先将浮点数a改成整数4,b改成整数2,所以运算完成后s的值是2。
程序实例 ch2_11.c:数据形态的转换应用。
另外,有时也可能会将整数(int)和字符(char)混用,它的处理原则是,先将字符转换成它所对应的整数值,然后进行运算。
实例5: 有一C语言指令如下:
i='a' - 'A';
假设i是整数,则在进行运算时,计算机首先将‘a’转换成ASCII码值97,然后将‘A’转换成ASCII码值65,所以运算完成后i的值是32。
程序实例 ch2_12.c:整数和字符混合使用。
至于有关整数和字符之间的应用,我们将在后面章节再做更详细的实例说明。
假设学生脚的尺寸是37.5,可是商店只售37码或38码的球鞋,现在售货员建议学生购买38码的球鞋。
程序实例 ch2_12_1.c:买球鞋程序。