首页 > 其他 > 详细

c 类型转换详解

时间:2015-03-28 06:30:07      阅读:265      评论:0      收藏:0      [点我收藏+]

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

    一般来讲,自动转换是将“比较窄的”转换成“比较宽的”,并不会丢失信息。例如: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

c 类型转换详解

原文:http://aslonely.blog.51cto.com/6552465/1625854

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!