了解类型转换。不同数据类型的存储大小和取值范围是不同的。程序在初始化时已经设置好,例如:inta=9;浮点数=8.5;a和b占用的字节大小不一样,大家应该都知道,在C语言中,一个表达式允许操作不同类型的数据,例如:inta=9;floatb=8.5,c;c=a+b;由于计算机硬件进行算术运算,要求每个操作数的类型具有相同的存储位数和相同的存储方式,所以出现了类型转换。对于某些类型的转换,编译器可以进行隐式自动转换,称为自动类型转换;而有些类型转换需要程序员显式指定,那么这种转换通常称为强制类型转换。自动类型转换自动转换是在源类型和目标类型兼容并且目标类型比源类型宽时发生的从一种类型到另一种类型的转换。先看一段代码://vs2019//来源:科技让梦想更伟大//作者:李逍遥#includeintmain(){//定义一个整型指针变量pPointint*pPoint;//定义基本数据类型charc;shorts;inti;longl;floatf;doubled;//将整型浮点数据赋值给指针类型pPoint=c;pPoint=s;pPoint=i;pPoint=l;pPoint=f;pPoint=d;return0;}因为指针变量和整数、浮点数等数据类型不能相互赋值,所以编译器报错输出:Thenweassignsametypeofdatatypeaftercalculation?//vs2019//来源:科技让梦想更伟大//作者:李逍遥#includeintmain(){//定义一个整型指针变量pPointint*pPoint;//定义基本数据类型charc;shorts;inti;longl;floatf;doubled;//将整型浮点数据赋值给指针类型pPoint=c+c;pPoint=s+s;pPoint=i+i;pPoint=l+l;pPoint=f+f;pPoint=d+d;return0;}同类型的char操作,结果是int类型。Short是同类型??运算,结果是int类型。同类型的int运算,结果是int类型。long是同类型操作,结果是long类型。float是同类型??运算,结果是float类型。同类型的double运算,结果是double类型。如下图所示:同类型运算中:整型:比int小的转成int,比int大的不变。浮点数:不变。那么我们如何在计算后分配不同类型的数据呢?//v??s2019//来源:科技让梦想更伟大//作者:李逍遥#includeintmain(){//定义一个整型指针变量pPointint*pPoint;//定义基本数据类型charc;shorts;inti;longl;floatf;doubled;//将整数和浮点数据的混合运算赋值给指针类型pPoint=c+s;//char+short=intpPoint=c+i;//char+int=intpPoint=c+l;//char+long=intpPoint=c+f;//char+float=longpPoint=c+d;//char+double=floatreturn0;}char类型和short类型操作,结果是一个int类型。char类型和int类型运算,结果是int类型。char类型和long类型运算,结果是long类型。char类型和float类型运算,结果是float类型。char类型和double类型运算,结果是double类型。结果如下图所示:可以得出结论,在不同类型的运算中:如果两边都小于int或者等于int,那么结果就是int。如果两边都大于int,则结果是一个大于int的类型。我们得到如图所示的结论:整数类型级别从低到高依次为:int->unsignedint->long->unsignedlong->longlong->unsignedlonglong浮点类型级别从低到高分别是:float->Double自动转换规则:图中的水平箭头表示需要进行的转换。比如运算中涉及到两个float类型。虽然是同一类型,但运算前必须先转为double,结果也是double。图中竖向箭头表示运算符两边的操作数类型不同时的转换。比如一个long型数据和一个int型数据一起运算,需要先把int型数据转成long型,然后再对两者进行运算。结果是long类型。将较高类型的数据转换为较低类型的数据时,可能会丢失一些数据。当较低类型的数据转换为较高类型时,通常只是改变了形式,而不会影响数据的实质。所有这些转换都是由系统自动进行的,你在使用时只需要知道结果的类型即可。强制类型转换强制类型转换是通过类型转换操作来实现的。它的一般形式是:(类型说明符)(表达式)它的作用是将表达式的运算结果转换为类型说明符所指示类型的值。//vs2019//来源:科技让梦想更伟大//作者:李逍遥#include#includeintmain(){floatf,x=1.3,y=1.4;inti=4,a,b;a=x+y;b=(int)(x+y);f=10/i;printf("a=%d,b=%d,f=%f,x=%f,y=%f\n",a,b,f,x,y);}运行结果如下:我们可以看到虽然x和y被强制转换为int类型,但是最终输出的值并没有改变,而强制的类型转换不影响x和y变量的原始类型。上面的警告已经说明了一切。注意:在C语言中,给变量赋值时,变量初始定义的类型包含两个含义:该数据类型所代表的内存空间的大小。编译器将设置的值放入这个内存空间,解析数据类型的存储方式后存储。总结强调强制类型转换后,内存空间中的内容不会改变。变化的是运行过程中临时数据对象的类型,也就是你读取内存空间时的分析方法。因此,我们必须清楚地了解这种数据类型的内存空间和解析方式。