C语言 基本数据类型的自动转换和强制转换

C语言基本数据类型的自动转换和强制转换

C语言自动类型转换

当C程序在进行赋值或运算时,精度小的类型自动转换为精度大的数据类型,这个就是自动类型转换。
C语言数据类型按精度(容量)大小排序:(精度由低到高)
在这里插入图片描述
数据类型自动转换规则表:(低级自动转换为高级)
在这里插入图片描述
C语言中,下面代码的自动转换是可以的(低级自动转为高级)。

	char ch = 'a';
	int num = 15;
	double fl = num;

C语言中,因为整形数据与浮点型数据存储方式不一样,所以下面的整形数据无法定义为浮点型数据。

	double i = 12;//输出时错误

编译时不会出现错误和警告,但是输出是出现错误输出,整形数据定义为浮点型输出数据都为0。
自动类型转换细节说明

  1. 有多种类型的数据混合运算时,系统首先自动将所有数据转换成精度最大的那种数据类型,然后再进行计算(如:int型和short型运算时,先把short转成int型后再进行运算)。
#include <stdio.h>
int main()
{
	int num1 = 45;
	float num2 = 60.722088;
	printf("大的类型float %f\n",num1 + num2);
	printf("小的类型int %\d\n",num1 + num2);
	return 0;
}

输出:

大的类型float 105.722088
小的类型int -1342177280//错误的的输出结果
请按任意键继续. . .
  1. 若两种类型的字节数不同,转换成字节数大的类型,若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型。
	int num1 = 56;
	unsigned int num2 = -99;
	printf("转换为有符号型:%d\n",num1 + num2);

输出:

转换为有符号型:-43
请按任意键继续. . .
  1. 在赋值运算中,赋值号右边量的类型将转换为左变量的类型,如果右边变量的数据类型长度比左边长,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。
    C语言中低级数据类型赋值给高级数据类型:
	float fl1 = 15.7f;
	double fl2 = 15.66666666;
	fl1 = fl2;
	printf("fl1 float类型输出:%.8lf\n",fl1);//精度损失
	printf("fl2 double类型输出:%.8lf\n",fl2);//精度不会损失

则会显示警告:warning C4244: “=”: 从“double”转换到“float”,可能丢失数据且输出数据的精度也会有损失。
输出:

fl1 float类型输出:15.66666698
fl2 double类型输出:15.66666666
请按任意键继续. . .

C语言强制类型转换

将精度高的数据类型转换为精度小的数据类型。使用时要加上强制转换符(),但可能造成精度的降低或溢出,格外要注意。
强制类型转换的一般格式:
(类型名)表达式
(表达式:任何有值的都可以称为表达式,如:1+2, int num = 2;)
这种强制类型转换操作并不改变操作数本身
C语言中,将精度大的数据赋值给精度小的数据会产生警告:

	double fl = 56.9999999;
	int num = fl;

警告:

warning C4244: “初始化”: 从“double”转换到“int”,可能丢失数据

为了避免出现这种编译型警告,我们可以对精度高的数据类型进行强制转换。

	double fl = 56.9999999;
	int num = (int)fl;//这里不是四舍五入,而是直接将小数点后的数据截断
	printf("%d\n",num);

这样编译时将不会出现warning。但是输出的数据精度会出现损失。原操作数fl本身内容不变。

56
请按任意键继续. . .

强制类型转换细节说明
1.当进行数据从精度高转换为精度低时,不想要出现警告,就需要使用到强制转换。
2.强制转换符号只针对最近的操作数有效,往往会使用小括号提升优先级。

    //错误演示
	int num = (int)3.5 * 10 + 5 * 2.5;//只对离它最近的3.5强转为3,num = 3*10+5*2.5
	printf("%d\n",num);

程序会出现警告:warning C4244: “初始化”: 从“double”转换到“int”,可能丢失数据且运行输出结果为:42。

	int num = (int)(3.5 * 10 + 5 * 2.5);//将3.5 * 10 + 5 * 2.5整个式子运算后结果为47.5,对47.5进行强转
	printf("%d\n",num);

程序不会出现警告,且运行输出结果为47。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值