当前位置:   article > 正文

C语言 08 类型转换

C语言 08 类型转换

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

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

自动类型转换

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

#include <stdio.h>

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

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

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

#include <stdio.h>

int main() {
    int a = 511;
    // 最大127
    char b = a;
    printf("%d", b);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
-1
  • 1

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

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

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

#include <stdio.h>

int main() {
    int a = 99;
    double d = a;
    printf("%f", d);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
99.000000
  • 1

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

#include <stdio.h>

int main() {
    double a = 3.14;
    int b = a;
    printf("%d", b);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
3
  • 1

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

#include <stdio.h>

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
1.500000
  • 1

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

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

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

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

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

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

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

强制类型转换

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

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

  • 1
  • 2

比如:

#include <stdio.h>

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

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

#include <stdio.h>

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
5
  • 1

在需要得到两个 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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/426498
推荐阅读
相关标签
  

闽ICP备14008679号