现在的位置: 首页 > 综合 > 正文

类型转换

2013年08月19日 ⁄ 综合 ⁄ 共 1454字 ⁄ 字号 评论关闭

类型转换分为两种,一种是隐式类型转换,一种是显式类型转换。这里举一个例子:

int
a=8.0/3;

.
8.0是double
类型(C规定,程序中出现的任何无后缀小数都为double
类型,
而出现的任何无后缀整数都为int
型,在写程序时一定要记住),而3是int
型。
除法运算可否在两种不同类型的变量之间进行呢?显然是不行的。因此,这里就需要转换。

我们知道,double
型可表示的范围远远大于int
型。
而C和C++在这类转换中的原则就是,
范围小的类型向范围大的类型转换。所以,3被转换成了double
值3.0,然后做除法。

8.0/3.0=2.666666……

如果这时这个值被赋给一个double
了,那么自然什么事都没有,double
得到了这个小数,
万事和谐……可惜我们这里没有这么和谐了,这个double
值被赋给了一个int
……
我刚才说什么来着?隐式类型转换只能从小到大转,可是现在怎么从大到小了呢?

不急。你可以先编译一下这个语句,你会得到这样一个警告:

warning C4244: “初始化”: 从“double
”转换到“int
”,可能丢失数据

.
因为double
int
要大,这样转换自
然容易丢失数据。想象一下不是2.666……,
而是1e200,自然int
就溢出了,你什么也得不到。这里只是警告,对于严格的编译器,
甚至会把它当作一个错误。

那么怎么办呢?这时我们就需要强制类型转换了。强制类型转换强迫编译器将一个
类型转换成较小的同一类类型。比如double
int

再比如int
char
,这样,
我们就可以很简单地避免警告了:

int
a=(int
)(8.0/3);

 

这时,应该就没有警告了。

这里提一下,细心的人可能发现了,我加了两对小括号(int
) 和(8.0/3),
第一对小括号是强制类型转换的语法,告诉编译器,将后面的值转换为括号里面的值。
而第二对小括号则要求先计算8.0/3,再对值做转换。

因为强制类型转换运算符的优先级高于除法,所以如果不加第二对小括号的话,
强制类型转换就针对8.0了,将8.0转换成int
,然后和int

除法。除号得到了两个类
型一致的值,自然喜出望外,马上计算了结果为2余2,丢弃了余数,将商传给a。注意
到,这里加不加第二对括号,其实结果是一样的,但是大家一定要明白其中的区别,
遇到类似的问题才不会迷茫。

大家明白类型转换了么?类型转换有几个重点:

1 类型转换只能在相关类型里面转。C里面所有的内置类型都是相关的,
因此可以做类型转换。而结构体,共用体,和C++里面的类都不是相关的,因此不能转换。
(如果非要转换怎么办?看完了本教程,请看习题)
2 如果转换后的类型“大于等于”转换前的类型,编译器就可以代劳,顺便帮我们转了。
而不需要我们指定。这种转换叫做隐式类型转换。而如果转换后的类型“小于”转换前的类型。
编译器就会担心:哎呀,你是不是写错了呢?是不是粗心了呢?就会给出警告甚至错误,
要求你写明“这里请你强制转换成特定类型”,编译器才能乖乖地按照你的意图,进行转换。

稍稍提一下。如果转换前的类型“等于”转换后的类型,基本上两者在内存中的“原始数据”
是一样的,是0xffff的就都是0xffff,但是,如果转换前的类型和转换后的不等了,
那么在内存中两者很可能就不一样了。不要以为一个等于1.0的浮点数在内存里面看起来
和等于1的int
是一样的。哪那么好的事情,你用起来觉得是一样的是因为编译器自动帮你转换了!
其实它们相差了十万八千里。因为这个缘故,在有符号类型和无符号类型之间转换的时候,
尤其要注意,不要弄错了值。

抱歉!评论已关闭.