语句和表达式通常应该只是用一种类型的变量和常量,如果使用混合类型,C使用一个规则集来完成自动类型转换。基本的规则
- 当出现在表达式中,无符号和有符号的char、short都被自动转为int;当short和int长度相同时,无符号short被转为unsigned int。K&R C 中,float还会被提升为 double;如今的C不这样了。(自动提升)
- 在包含两种类型的任何云算力,两个值都被转换为级别较高的类型。
- 类型级别从高到低依次是:long double、double、float、unisgined long long、long long、unsigned int、int。一个可能的例外是当long和int具有相同的长度时,unsinged int 比 long 的级别高。因为short和char会提升为int或unsigned int,所以清单里没有它们。
- 赋值语句中,计算的最后结果被转换成被赋值的那个变量的类型。可能是类型提升也可能是降级。
- 函数传参,char和short被转为int;float 被转为double。
类型提升一般是平滑的无损过程;降级则可能导致严重错误。浮点数降级为整数时,按照趋零截尾或舍入,25.2->25、25.9->25、-25.2->-25、-25.9->-25。
大整数转为较小的整数类型时,直接截取低位上的位,高位直接截断舍去。所以unisnged short 变char 的时候,65535截断就变成了char里的-1。
和Java不同,C语言中数值类型之间都可以直接赋值(自动类型转换(提升或降级))。数值类型和指针、数组、结构体之间不能直接赋值。需要进行类型指派(cast)。C语言的强制类型转换(也叫指派,cast),可以实现任意类型之间的转换(Java就不行)。
Java更严格,C更自由。相信程序员
是C的信条之一,所以C给予程序员很大的自由,同时需要程序员承担起不滥用自由的责任。自由越大、责任重
。