当一个运算符的几个操作数类型不同时,就需要通过一些规则把它们转换成某种共同的类型。一般来说,自动转换是把"比较窄的"操作数转换成"比较宽的"操作数,并且不丢失信息的转换,例如,在计算表达式1.1+1
时,1
会自动转换为1.0
。不允许使用无意义的表达式,例如,不允许把float
类型的表达式作为下标。针对可能导致信息丢失的表达式,编译器可能会给出警告信息,比如把较长的整型值赋给较短的整型变量,把浮点型赋值给整型变量,等等。打这些表达式并不非法。
char
类型就是长度较小的整型,将char
类型转换成整型时,我们需要注意一点。C语言没有指定char
类型的变量是无符号(signed)还是有符号(unsigned)。当把一个char
类型的值转换成int
类型的值时,其结果有没有可能为负整数?对于不同的机器,其结果也不同,这反映了不同机器结构之间的区别。在某些机器中,如果char
类型值得最左一位为1,则转换为负整数。而在另外一些机器中,把char
类型值转换为int
类型时,在char
类型值得左边添加0,这样导致的转换结果值总是正值。为了保证程序的可移植性,如果要在char
类型的变量中存储非字符数据,最好指定signed
或unsigned
限定符。
c语言中,很多情况下会进行隐式的算术类型转换。一般来说,如果二元运算符的两个操作数具有不同的类型,那么在进行运算之前先把较低的类型提升为较高的类型,运算的结果为较高的类型。
不光在运算时会有类型转换,赋值时也要进行类型转换。赋值运算符右边的值需要转换为左边变量的类型,左边变量的类型即赋值表达式结果的类型。在函数调用的参数传递时也会进行类型转换。
未完。。。