C程序设计——类型转换

什么是类型转换

当两个不同类型的数据,进行算数运算时,就需要将两个数据转换成同一类型,再运算,这就叫类型转换。

注意,类型转换只是发生在计算过程中,并不更改变量或常量本身的类型。

隐式类型转换

经常写代码的同学都知道,进行算术运算时,运算符两边的数据类型,有时候会不一样,C编译器在处理的时候,会将两种类型转换为同一类型后,再进行计算。这种处理对程序员是透明的。

隐式类型转换的规则

隐式转换的前提是,参与运算的两个数,类型不同。

若参与运算的两个数中,有浮点数:

如果任何一个操作数是 double型,则在运算时,另一个操作数,也转换为double型,运算结果为 double ,

否则,如果任何一个操作数是 float 型,则在运算时,另一个操作数,也转换为float型,运算结果为float;

如果参与运算的,是两个不同类型的整数:

此时会将较短的类型,扩展为较长的类型,再进行计算,扩展算法为:

  1. 如果较短的类型是有符号的,则进行符号扩展;
  2. 如果较短的类型是无符号的,则高位补 0 。

显示类型转换

经常写代码的同学都知道,隐式类型转换,有时候转换的方法,不一定跟想象的一样,造成运算结果不符合预期。因此,C语言里定义了显示类型转换。显示类型转换的格式如下:

(类型名)(操作数);

这里的操作数,可以是变量,也可以是常量,先上代码:

int main(void)
{
    int iA = 1000 ;
    char cA = -1 ;
    unsigned char ucB= -1 ;

    printf("iA == %d, cA == %d, ucB == %d\r\n", iA, cA, ucB);

    // 将 cA 强制转化为 int型
    printf("iA + (int)cA == %d\r\n", iA + (int)cA);

    // 将 ucB 强制转化为 int型
    printf("iA + (int)ucB == %d\r\n", iA + (int)ucB);

    // 将 iA 强制转化为 char型
    printf("(char)iA + cA == %d\r\n", (char)iA + cA);

    // 将 iA 强制转化为 unsigned char型
    printf("(unsigned char)iA + ucB == %d\r\n", (unsigned char)iA + ucB);
}

运行结果如下: 

ucB 明明赋值为 -1 ,但是打印时却是 255,这个好解释,因为 -1 \equiv 255 \left ( mod256 \right ),所以无符号的时候 -1 就是255,有符号的时候 255 就是 -1,相信大家能理解,是吧。

(unsigned char)iA + ucB 的结果,看起来也很奇怪,明明是做加法,但是运算结果比 1000 小,比255 大,这个坑先留着,到后面再解释。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十三香炖猪肉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值