当运算符的几个操作数类型不同时,编译器会通过一些规则来把它们转换为某种相同的类型。
1.自动转换(隐式类型转换)
如果没有进行强制类型转换,默认为自动转换。
当一个运算符的几个操作数类型不同时,自动转换的原则是将“比较窄的”操作数转换为“比较宽的”操作数,并且不丢失信息。
特例:对于赋值运算符,赋值运算符右边的值要转换成左边变量的类型,左边变量的类型即赋值表达式结果的类型。右边的“宽”操作数转换为左边的“窄”操作数时,超出的高位部分直接被丢弃。
1.1将字符类型转换为整型
C语言没有指定char类型的变量是无符号变量(signed)还是带符号变量(unsigned)。在某些机器中,char类型值的最左一位为1,而在另一些机器中char类型值的最左一位为0。字符类型转换为整型时会进行“符号位扩展”。对于有符号数,用符号位填充高位字节。对于无符号数,用0填充高位。
C语言的定义保证打印字符集中的字符总是正值。但是,存储在字符变量中的位模式在某些机器可能是负值,而在另一些机器上可能是正的。为了程序的可移植性,如果要在char类型的变量中存储非字符数据最好显示指定singned或unsigned限定符。
1.2有符号数和无符号数之间的转换
当操作数中既有无符号数又有有符号数时,无符号数将自动转换成有符号数再进行运算。
-1L<1U,这是因为unsigned int类型的1U被提升为singed long类型;而
-1L>1UL,这是因为-1L转换为unsignedlong类型时,最高位为1,是一个比较大的正数。
1.3赋值运算符的类型转换
较长的整数转换为较短的整数或char类型时,超出的高位直接被丢弃。因此,下面的程序片段
int i;
char c;
i = c;
c = i;
i的值不会有变化。(无论是否进行符号位扩展,该结论都成立)
如果上面赋值语句的次序颠倒一下:
c=i;
i=c;
如果i是一个负数(高位为1),经过上面的赋值后高位信息将丢失,i将变成一个整数。
2.强制类型转换
语法规则:(类型名)表达式
强制类型转换的规则和自动转换一样:长转短,可能丢失信息;短转长,符号位填充;
注意:强制类型转换只是生成一个指定类型的值,操作对象本身是没有什么改变的。
2.1函数参数的自动强制转换
在调用函数时,如果传入的参数和函数原型申明参数类型不一样,将进行自动强制类型转换,转换不了就报错。
PS:C语言标准库中(K&C之后的版本),没有一个函数参数是char型的。要用到char型的函数都用int代替了。所以你传入的char都会转换为int型后传入。
阅读(921) | 评论(0) | 转发(0) |