C 程序设计教程(07)—— 数据类型转换
该专栏主要介绍 C 语言的基本语法,作为《程序设计语言》课程的课件与参考资料,用于《程序设计语言》课程的教学,供入门级用户阅读。
目录
- C 程序设计教程(07)—— 数据类型转换
- 一、自动类型转换
- 二、赋值类型转换
- 三、强制类型转换
 
各种类型的数据可以混合运算,例如:
x = 10+'a'+1.5-12.34*'b';
在进行混合运算时,不同类型的数据要转换成同一类型的数据。
一、自动类型转换
混合于同一表达式中的不同类型常量及变量,应变换为同一类型的量。编译程序将所有操作数变换为与最大类型操作数同类型。具体规则如下:
(1)所有 char 及 short int 型量转换为 int 型,所有 float 转换为 double。
(2)如果操作数对中一个为 double,另一个转换为 double。否则,一个为 long,另一个转换为 long。
(3)一个为 unsigned,另一个转换为 unsigned。
通过以上规则,每一对操作数均变为同一类型。例如:
#include<stdio.h>
int main()
{
	char ch='A';
	int i=2;
	float f=2.5;
	double d=1.2,result;
	result=ch/i+f*d-(f+i);
	//(1)执行 ch/i=32,把ch转换为int类型 
	//(2)执行f*d=3.0,把f转换为double类型 
	//(3)执行f+i=4.5,把f和i转换为double类型 
	//(4)执行32+3.0-4.5=30.5 
	printf("%lf\n",result);
	return 0;
} 
以上程序的运行结果如下:

二、赋值类型转换
进行赋值运算时,当赋值运算符两边的数据类型不用时,将由系统自动进行类型转换。
转换的原则是:赋值运算符右边的数据类型转换成左边的变量类型。转换规则如下:
| 赋值运算符左侧类型 | 赋值运算符右侧类型 | 转换说明 | 
|---|---|---|
| float | int | 将整型数据转换成实型数据后再赋值。 | 
| int | float | 将实型数据的小数部分截去后再赋值。 | 
| long | int、short | 值不变 | 
| int、short | long | 右侧的值不能超过左侧数据值的范围。否则将会导致不可预料的结果。 | 
| unsigned | signed | 按原样赋值。右侧的值不能超过左侧数据值的范围。 | 
| signed | unsigned | 按原样赋值。右侧的值不能超过左侧数据值的范围。 | 
例如:
#include<stdio.h>
int main()
{
	char ch;
	int i;
	float f;
	double d;
	long l;
	short s;
	i=1; 
	f=i;
	printf("%f\n",f);
	f=25.8;
	i=f;
	printf("%d\n",i);
	s=5;
	l=s;
	printf("%d\n",l);
	l=56;
	i=l;
	printf("%d\n",i);
	l=3466347634764;  //数值太大 
	i=l;
	printf("%d\n",i); //输出错误 
	return 0;
} 
以上程序的运行结果如下:

三、强制类型转换
强制类型转换通过类型转换运算来实现。格式为:
(type)exp;
其功能是把表达式的运算结果强制转化成类型声明符所表示的类型。例如:
#include<stdio.h>
int main()
{
	int i;
	for(i=1;i<=100;i++)
	{
		printf("%d/2 is:%f  ",i,(float)i/2);
		if(i%5==0) printf("\n");
	} 
	return 0;
} 
以上程序的运行结果如下:

说明:
(1)类型声明符和表达式都必须加括号(单个变量可以不加括号)。例如:(int)(x+y) 表示把 x+y 的运算结果强制转换为 int 型。而 (int)x+y 表示把 x 强制转换为 int 型之后再和 y 相加。
(2)无论是强制转换还是自动转换,都只是为了本次运算的需要而对变量进行的临时性转换,而不改变变量本身的类型。










![BUUCTF 之 [ACTF2020 新生赛]Exec(命令执行漏洞)](https://img-blog.csdnimg.cn/7b1b089062d4453e87589c85877e7ec7.png)








