一种类型的数据转换为另一种类型的数据,这种操作称为类型转换。
类型转换分为自动类型转换和强制类型转换。
自动类型转换
比如现在希望将一个 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;// 最大127char 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);
}
合理地使用强制类型转换,能够解决很多情况下的计算问题。