自动类型转换
常见的自动类型转换分两种情况:
1,不同类型的数据进行运算时,系统会自动将运算优先级别低的转换成级别高的,结果和运算级别高的数据类型一样。
2,赋值运算符两边类型不一样时,系统会自动将右侧表达式的类型转换成左侧的变量类型,然后再赋值
复制运算的时候
左边 <= 右边
大A <= 小a;
自动转化为:
大A <= 大A;
强制类型转换
小a <= 大A;
会有数据损失【蓝色】
下面设计程序做详细的分析:
【类型A】num0 = 【类型B】(强制类型转换)(num1 / num 2)
double a;
int A;
a = 2/3;
printf( "a = (2 / 3 f) = %f\n",a );
printf( "a = (2 / 3 d) = %d\n\n",a );
a = (double) 2/3;
printf( "a = (double)(2 / 3 f) = %f\n",a );
printf( "a = (double)(2 / 3 d) = %d\n\n",a );
a = 3/2;
printf( "a = (3 / 2 f) = %f\n",a );
printf( "a = (3 / 2 d) = %d\n\n",a );
a = (double) 3/2;
printf( "a = (double)(3 / 2 f) = %f\n",a );
printf( "a = (double)(3 / 2 d) = %d\n\n",a );
printf( "*-----------------*\n" );
A = 2/3;
printf( "A = (2 / 3 f) = %f\n",A );
printf( "A = (2 / 3 d) = %d\n\n",A );
A = (int)2/3.0;
printf( "A = (int)(2 / 3 f) = %f\n",A );
printf( "A = (int)(2 / 3 d) = %d\n\n",A );
A = 3/2;
printf( "A = (3 / 2 f) = %f\n",A );
printf( "A = (3 / 2 d) = %d\n\n",A );
A = (int)3/2.0;
printf( "A = (int)(3 / 2 f) = %f\n",A );
printf( "A = (int)(3 / 2 d) = %d\n\n",A );
printf( "*-----------------*\n" );
A = 2/1;
printf( "A = (2 / 1 f) = %f\n",A );
printf( "A = (2 / 1 d) = %d\n\n",A );
A = (int)2/1.0;
printf( "A = (int)(2 / 1.0 f) = %f\n",A );
printf( "A = (int)(2 / 1.0 d) = %d\n\n",A );
A = 3/1;
printf( "A = (2 / 1 f) = %f\n",A );
printf( "A = (2 / 1 d) = %d\n\n",A );
A = (int)2/1.0;
printf( "A = (int)(2 / 1.0 f) = %f\n",A );
printf( "A = (int)(2 / 1.0 d) = %d\n\n",A );
输出结果:
a = (2 / 3 f) = 0.000000
*//1( 2 / 3 = 0,再转换为0.00000,赋给double_a,以 “ % f” 浮点型格式输出0.000000 )
a = (2 / 3 d) = 0
*//2( 2 / 3 = 0,再转换为0.00000,赋给double_a,以 “% d” 整型格式输出 0 )
a = (double)(2 / 3 f) = 0.666667
*//3( 先将 2 和 3 都转换为double型,2.0 / 3.0 = 0.666667,赋给double_a,以 “ % f” 浮点型格式输出0.666667 )
a = (double)(2 / 3 d) = 1431655765
//*4(目前还不清楚)
a = (3 / 2 f) = 1.000000
//同 2
a = (3 / 2 d) = 0
//0不论计算结果非小数位是否为0,int型结果以 %f 和 double型结果以 %d 输出的时候,结果都是0,或者0.000000;
a = (double)(3 / 2 f) = 1.500000
//正确
a = (double)(3 / 2 d) = 0
//强制类型转换后 a = 1.5,但是以%d 整型输出,同0
-----------------
A = (2 / 3 f) = 0.000000
//同0
A = (2 / 3 d) = 0
//正确
A = (int)(2 / 3 f) = 0.000000
//同0
A = (int)(2 / 3 d) = 0
//同2
A = (3 / 2 f) = 0.000000
//同0
A = (3 / 2 d) = 1
//同1
A = (int)(3 / 2 f) = 0.000000
//同0
A = (int)(3 / 2 d) = 1
//和上面的对比
-----------------
A = (2 / 1 f) = 0.000000
//同0
A = (2 / 1 d) = 2
//正确
A = (int)(2 / 1.0 f) = 0.000000
//同0
A = (int)(2 / 1.0 d) = 2
//正确
A = (2 / 1 f) = 0.000000
//同0
A = (2 / 1 d) = 3
//正确
A = (int)(2 / 1.0 f) = 0.000000
//同0
A = (int)(2 / 1.0 d) = 2
/正确
Press any key to continue
补充
针对
a = (double)(2 / 3 f) = 0.666667
*//3( 先将 2 和 3 都转换为double型,2.0 / 3.0 = 0.666667,赋给double_a,以 “ % f” 浮点型格式输出0.666667 )
我们又验证了这样的一个情况
A = (int)21/2.9;
printf( “A = (int)(21 / 2.9 d) = %d\n”,A );
运算结果:
A = (int)(21 / 2.9 d) = 7
//如果按照 3 的逻辑,这里先将里面的数都转换为int类型,变为 (21 / 2 = 10),但是输出结果为 7(21 / 2.9 = 7.24…),证明为了保证精度,double型变量的计算比int型有更高的优先级,由于除数有小数位,先换算成(21.0 / 2.9 = 7.24…),再转换成int型 7,赋给intA;