C语言基本数据类型的自动转换和强制转换
C语言自动类型转换
当C程序在进行赋值或运算时,精度小的类型自动转换为精度大的数据类型,这个就是自动类型转换。
C语言数据类型按精度(容量)大小排序:(精度由低到高)
数据类型自动转换规则表:(低级自动转换为高级)
C语言中,下面代码的自动转换是可以的(低级自动转为高级)。
char ch = 'a';
int num = 15;
double fl = num;
C语言中,因为整形数据与浮点型数据存储方式不一样,所以下面的整形数据无法定义为浮点型数据。
double i = 12;//输出时错误
编译时不会出现错误和警告,但是输出是出现错误输出,整形数据定义为浮点型输出数据都为0。
自动类型转换细节说明
- 有多种类型的数据混合运算时,系统首先自动将所有数据转换成精度最大的那种数据类型,然后再进行计算(如: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//错误的的输出结果
请按任意键继续. . .
- 若两种类型的字节数不同,转换成字节数大的类型,若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型。
int num1 = 56;
unsigned int num2 = -99;
printf("转换为有符号型:%d\n",num1 + num2);
输出:
转换为有符号型:-43
请按任意键继续. . .
- 在赋值运算中,赋值号右边量的类型将转换为左变量的类型,如果右边变量的数据类型长度比左边长,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。
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。