C语言中的强制类型转换分析

自动类型转换

常见的自动类型转换分两种情况:

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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C语言强制类型转换是将所需变量或表达式的值转换为指定的类型,但并不改变原来变量和表达式的类型属性。强制类型转换使用圆括号将需要转换的表达式括起来,并在括号内注明目标类型。例如,在代码的语句m=(int)(x+y),将x+y的结果强制转换为整型,并将结果赋值给变量m,得到m=7。同样地,在语句n=(int)x+m/3,将x的类型强制转换为整型,然后计算表达式的值为2+7/3。需要注意的是,这种转换不会改变x和y的数据类型,它们仍然保持为浮点型。总结起来,C语言强制类型转换可以将一个值转换为指定的类型,但不会改变原来变量和表达式的类型属性。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [C语言程序——类型强制转换](https://blog.csdn.net/glx6666/article/details/125305215)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [C语言强制类型转换)](https://blog.csdn.net/little_startoo/article/details/128983542)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值