1.数据类型强制转换一般格式:(数据类型符)(表达式)
2.说明:无论是自动的还是强制的转换,当把数据长度较长的结果存入数据长度较短的变量时,将截去超出的部分,有可能造成错误。
3.流程:首先按照自动转换类型原则计算表达式的值,然后转换为指定类型。
注:若表达式仅仅是单个常量或变量时,外面的对圆括号可以省略,若是含有运算符的表达式,则必须用一对圆括号括起来!
4.中间变量:强制类型转换获得的是一个所需类型的中间量,原表达式/变量的类型和值不发生改变。(参与运算的常量或变量类型自动转换是临时的)
5.精度丢失问题:较高类型转换成较低类型时,会截去超出部分,丢失小数点后的数值。
6.效率问题:类型转换将占用系统时间,过多的转换会降低程序运行效率。
7.例题:设 float x=2.5,y=3,1;则表达式(int)(x+y)的类型为?
- 分析:x+y会自动转换成double类型
- 但是(int)将表达式强制转换成整型
8.例题:设int x;能正确将x+2强制转化为双精度实型的表达式是?
- 分析:强制转化格式:(数据类型符表达式)
- 又因为x+2不是单个常量也不是单个变量,括号不能省略。
- 所以(double)(x+2)
9.例题:设double x=5.168;
执行printf("%5.3f\n",(int)(x*10+0.5)/10.0);后的输出结果是 ?
- 分析:(x10+0.5)=5.16810+0.5=52.18
- (int)52.18=52
- 52/10.0=5.2
- 又因为%5.3f表示输出所占域宽为5保留3位小数的实型数据
- 所以结果为5.200
10.例题:如果要将表达式(3*4.5)强制转换成长整型,则该写成?
- 分析:长整型类型关键字是long
- *在 (3**4.5)之前加long即可
- (long)(3*4.5)
11.例题:设int a;float b=1.9;
执行语句a=(int)b;后变量a和b的值分别是?
- 分析:a=(int)b是将b的值转成int类型赋值给a
- 所以a=1
- b的值并未改变,还是1.9
12.例题♥♥:设float a;,执行表达式(double)a后,a的类型是?
- 分析:本身a 是float类型
(double) a
进行强制类型转换,用来将float
类型的值a
转换为double
类型- 这种类型转换仅影响表达式的计算过程,不会改变变量本身类型
- 执行
(double) a
后,a
的类型仍然是float
,它只是在表达式中被临时转换为double
类型以进行计算
//代码举例
#include <stdio.h>
int main() {
float a = 1.5, b;
b = (int)a;
printf("a=%f\n", a);//a=1.500000
printf("b=%d\n", b);//b=0 以错误类型输出造成结果错误,b本质上还是float类型
printf("b=%f\n", b);//b=1.000000
//强制转型不改变原来的值和数据类型,只是临时的
//将 a 强制转换为整数类型,并将结果存储在 b 中
}
13.例题:设float m=3.89;则执行语句print("%d\n",(int)m);
后输出结果是?
- 分析:(int)m是指将m强制转换成int类型
- 所以输出结果为3
14.例题:设int A=9,B=6,C;,执行语句C=A/B+0.8;后C 的值是?
- 分析:先计算A/B=9/6=1
- 然后1+0.8=1.8
- 接着因为C是int类型,所以C=1