C语言的类型转换机制

由于C语言的隐式类型转换,经常让我感到迷惑或者带来bug。在这里翻译一下C标准的转换机制。
其实我人为,这种转换完全没有必要存在于语言层面。
总的来说首先保证转换精度,其次按照取模的方式转化为无符号整数。

  • 转换
    有些操作符依赖于它们的操作数本身来进行操作数的类型转换。这一章就解释了这些转换带来的结果。

    1.Integral promotion
    一个字符/短整型或者一个整数位,无论是不是有符号,或者一个枚举对象,都可能用在一个本应是整型
    的位置上。如果int可以表示原有类型的所有值,那么就转化为int,否则就转化为unsigned int。
    这就叫integral promotion.

    2.Integral conversions
    任何整数转化为unsigned都是通过取模(无符号数的)的方法,在补码表示中,如果无符号数比较短
    这就相当于去掉最左面的位;如果无符号数比较长,只要加上模值就可以了。
    当任何整数转化为有符号类型的时候,那么如果能够用新的类型表示就表示,不能表示的话就随实现的不同而不同了。

    3.Integer and Floating
    当一个浮点数转化到整数,小数部分就舍去,如果结果不能由整数类型表示,行为是未定义的。In particular,
    将负浮点数转化为无符号整数是未定义的。
    当一个整数转化为一个浮点数,如果是在浮点数的表示范围之内,但不是可表示的,那么可能是最近的可表示值
    或者大一些或者小一些,不一定要绝对值最小。如果不在表示范围内,那么行为是未定义的。

    4.浮点数类型
    当一个浮点数转化为一个更高精度的浮点数的时候,值不变。当一个更高进度的浮点数转化为一个低精度的浮点数
    的时候,而且在可表示的范围内,那么就用“最近”的值表示,或大或小,不一定要绝对值最小。

    5.算数转换
    很多操作符会以类似的方式引起转换或者产生结果类型。效果就是将操作变成一样的类型。这种模式就叫做常规
    算术转换。是long double, 那么另一个转化为long double.
    otherwise,如果有一个操作数是double,那么另一个就转化为double.
    otherwise,如果有一个操作数是float,那么另一个就转化为float.
    otherwise,integral promotion在操作符两边都起作用;然后如果有一个操作数是
    unsigned long int,那么另一个也转换为unsigned long int。
    otherwise,如果一个操作数是long int,另一个是unsigned int,这时候取决于两者的表示能力,如果前者
    能表示后者,那么就转换为long int否则转换为unsigned int.
    otherwise,如果一个操作数是long int,那么另一个就转换为long int。
    otherwise,如果一个操作数是unsigned int,那么另一个就转化为unsigned int.
    otherwise,两个操作数都是int.

    首先,如果有一个操作数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值