C语言 07 类型转换

一种类型的数据转换为另一种类型的数据,这种操作称为类型转换

类型转换分为自动类型转换强制类型转换

自动类型转换

比如现在希望将一个 short 类型的数据转换为 int 类型的数据:

#include <stdio.h>

int main(){
    short s = 10;
    // 直接将s的值传递给i即可,但是注意此时s和i的类型不同
    int i = s;
}

这里其实就是一种自动类型转换,就是编译器隐式地进行的数据类型转换,这种转换不需要编写者做什么,直接写就行,会自动进行转换操作。

如果使用一个比转换的类型最大值都还要大的值进行类型转换,比如:

#include <stdio.h>

int main() {
    int a = 511;
    // 最大127
    char b = a;
    printf("%d", b);
}
-1

很明显 char 类型是无法容纳大于 127 的数据的,因为只占一个字节。
而 int 占 4 个字节,如果需要进行转换,那么就只能丢掉前面的就只保留 char 所需要的那几位了,所以这里得到的就是 -1:

int = 511 -> 00000000 00000000 00000001 11111111
char -> 11111111 -> -1

也可以将整数和小数类型的数据进行互相转换:

#include <stdio.h>

int main() {
    int a = 99;
    double d = a;
    printf("%f", d);
}
99.000000

这里需要注意的是:小数类型在转换回整数类型时,会丢失小数部分(不是四舍五入,是直接丢失小数):

#include <stdio.h>

int main() {
    double a = 3.14;
    int b = a;
    printf("%d", b);
}
3

除了赋值操作可以进行自动类型转换之外,在运算中也会进行自动类型转换,比如:

#include <stdio.h>

int main() {
    float a = 2;
    int b = 3;
    double c = b / a;
    printf("%f", c);
}

1.500000

如果参与运算的既有整数类型,又有浮点类型,结果为什么是浮点类型呢?这是由于类型转换导致的。规则如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 不同的类型优先级不同(根据长度而定)

  • char和short类型在参与运算时一律转换为int再进行运算。

  • 浮点类型默认按双精度进行计算,所以就算有 float 类型,也会转换为 double 类型参与计算。

  • 当有一个更高优先级的类型和一个低优先级的类型同时参与运算时,统一转换为高优先级运算。

    int 和 long 参与运算,那么 int 转换为 long 再算,所以结果也是 long 类型;
    int 和double 参与运算,那么先把 int 转换为 double 再算,所以结果也是 double 类型。

强制类型转换

强制类型转换可以手动去指定类型,格式如下:

(强制转换类型) 变量、常量或表达式;

比如:

#include <stdio.h>

int main() {
    // 2.5是一个double类型的值,但是可以强制转换为int类型赋值给a,强制转换之后小数部分丢失
    int a = (int) 2.5;
    printf("%d", a);
}
2

也可以对一个算式的结果进行类型转换:

#include <stdio.h>

int main() {
    double a = 3.14;
    // 注意得括起来表示对整个算式的结果进行类型转换,不然强制类型转换只对其之后紧跟着的变量生效
    int b = (int) (a + 2.8);
    printf("%d", b);
}

5

在需要得到两个 int 相除之后带小数的结果时,强制类型转换就显得很有用:

#include <stdio.h>

int main() {
    int a = 10, b = 4;
    // 不进行任何的类型转换,int除以int结果仍然是int,导致小数丢失
    double c = a / b;
    // 对a进行强制类型转换,现在是double和int计算,根据上面自动类型转换规则,后面的int自动转换为double,结果也是double了,这样就是正确的结果了
    double d = (double) a / b;
    printf("不进行类型转换: %f, 进行类型转换: %f", c, d);
}

合理地使用强制类型转换,能够解决很多情况下的计算问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天航星

感谢你的鼓励和认可

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

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

打赏作者

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

抵扣说明:

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

余额充值