当一个运算符的几个操作数类型不一致时,就需要将其转换成相同类型
一般来讲,自动转换是将“比较窄的”转换成“比较宽的”,并不会丢失信息。例如:f + i时把i转换成f
不允许使用无意义的表达式,如:下标不能为浮点型
对于丢失精读的转换,编译器会给予警告:例如把int型转换成char型。但该操作并不非法。
c语言标准没有指定char类型是unsigned还是signed,当把char类型转换成int时,对于不同的机器,结果不相同
在某些机器中,若char最高位为1,则转换成复数,而在另一些机器中,char转换时总在高位补零。
C语言的定义保证机器的标准打印字符集不会是负值,因此在表达式中这些字符重视正的。
如上为ASCⅡ码表,最高位始终为0,避免了字符集为负的可能性
PS:为了保证程序的可一致性,若在char中要存放非字符时,最好指定signed或者unsigned
在Windows平台使用vc++6.0中,char默认为signed
隐式转换:
原则是将较低类型转换成较高类型,如果没有unsigned,可以使用下面的非正式规则;
若其中一个为long double,则将另一个转换成long double型
若其中一个为double,则将另一个转换成double
若其中一个为float,则将另一个转换成float
将 char和short 转换成 int
若其中一个为long,将另一个转换成long
当包含unsigned时,转换规则复杂一些
例如:假设int为16位,long为32位
则 -long<unsigned int,因为unsigned会被转换成signed long。
但是 -long>unsigned long,因为-long会被提升为unsigned long。
具体转换规则参见文末。。。
当把较长整数转换成较短整数或char时,超出的部分会被丢弃
当把double转换成float时,是四舍五入还是截取取决于编译器的具体实现
强制转换:
(类型名)表达式 例如 float b = 1.0; int a = (int)b;
注意正确理解强制转换:可以设想存在一个临时变量,表达式首先被赋值到临时变量,然后在用该临时变量替换(类型名)表达式,运行该句后表达式的值并不会发生改变。
当存在函数原型时,会进行强制转换,例如:存在double sqrt(double),则sqrt((double)2)等价于sqrt(2)
C语言转换规则:
(1)整数和浮点型:
浮点型转换成整型时,小数部分被省略,如果其值不能被整型表示,则其行为未定义。注意:将负的浮点型 转换成unsigned int 结果是没有定义的。
当把整型转换成浮点型时,如果该值是在可表示范围内,则结果可能是下一个较高或者较低的可表示值。
如果结果在范围外,则行为未定义。
(2)浮点型:
将较低精读浮点型转换成较高浮点型时:值不变。
将较高精度转换成较低精度时:在范围内,值不变,在范围外,结果为定义
(3)整型提升:
如果原始类型都可以用int表示,则将其转换成int,否则被转换成unsigned int
(4)整型转换:
将unsigned 转换成 signed 时,如果可以在新类型表示,则表示,如果不能表示,结果与具体实现有关
本文出自 “无用大叔” 博客,请务必保留此出处http://aslonely.blog.51cto.com/6552465/1625854
原文:http://aslonely.blog.51cto.com/6552465/1625854