当一个运算符的几个操作数类型不一致时,就需要将其转换成相同类型。

   一般来讲,自动转换是将“比较窄的”转换成“比较宽的”,并不会丢失信息。例如:f + i时把i转换成f

不允许使用无意义的表达式,如:下标不能为浮点型。

对于丢失精读的转换,编译器会给予警告:例如把int型转换成char型。但该操作并不非法。

c语言标准没有指定char类型是unsigned还是signed,当把char类型转换成int时,对于不同的机器,结果不相同。

在某些机器中,若char最高位为1,则转换成复数,而在另一些机器中,char转换时总在高位补零。

C语言的定义保证机器的标准打印字符集不会是负值,因此在表达式中这些字符重视正的。

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 时,如果可以在新类型表示,则表示,如果不能表示,结果与具体实现有关,将signed 转换成unsigned时,若unsigned位数窄,对二进制补码进行左截取,若unsigned宽,对signed进行符号扩展。

  (5)指针和整数:

    指针可加上或着减去一个整数,转换规则按照加法运算符号方式进行,两个指向同一数组的指针可进行加减运算,方式按照算数转换规则,值为0的整型常量或者void*型表达式可转换成任意类型的指针,指针可以转换成整型,注意整型必须足够大,整型对象可以转换成指针,一般用于将一个足够宽的从指针转换来的整型转换成(恢复)指针,不同类型的指针间可以相互转换,但必须满足内存对齐条件,一个指针可以转换成同意类型的另一个指针,但是可以增加或者删除另一个指针的限制符,如果和另一个指针,增加了相同的修饰符,则和另一个指针一样,如果删除了修饰符,则底层对象的运算仍受到原声明的限制。

        

思考下面三段代码(平台:Windows7  64位   开发工具:vc 6.0)  c 类型转换详解_类型转换_02 c 类型转换详解_C语言_03c 类型转换详解_类型转换_04