Biao 2020-08-20
在C语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统,我们常用的算术类型包括两种类型:整数类型和浮点类型。那么相互之间具体是怎么转化的呢?
了解一下类型转换
不同数据类型的存储大小和值范围是不一样的,程序在初始化的时候就已经设定了,例如:
int a = 9; float b = 8.5;
a,b占的字节大小不一样,这个我们应该都知道,在C语言中一个表达式允许不同类型的数据进行运算,例如:
int a = 9; float b = 8.5,c; c = a + b;
因为计算机硬件在进行算术操作时,要求各操作数的类型具有相同的存储位数以及一样的存储方式,所以就出现了类型转换。
对于某些类型的转换,编译器可以隐式地自动进行,这种转换称为自动类型转换;
而有些类型转换需要程序员显式指明,那么通常把这种转换称为强制类型转换。
自动类型转换
自动转换是在源类型和目标类型兼容以及目标类型广于源类型时发生一个类型到另一类的转换。我们先来看一段代码
//vs2019  
//来源:技术让梦想更伟大  
//作者:李肖遥  
#include <stdio.h>  
int main()  
{  
 //定义一个整型指针变量pPoint  
 int* pPoint;  
 //定义基本的数据的类型  
 char c;  
 short s;  
 int i;  
 long l;  
 float f;  
 double d;  
 //将整型浮点型数据赋值给指针类型  
 pPoint = c;  
 pPoint = s;  
 pPoint = i;  
 pPoint = l;  
 pPoint = f;  
 pPoint = d;  
 return 0;  
} 由于指针变量和整型、浮点这些数据型的类型是不能相互赋值的,编译报错输出:

那么我们把同类型数据类型进行运算后赋值呢?
//vs2019  
//来源:技术让梦想更伟大  
//作者:李肖遥  
#include <stdio.h>  
int main()  
{  
 //定义一个整型指针变量pPoint  
 int* pPoint;  
 //定义基本的数据的类型  
 char c;  
 short s;  
 int i;  
 long l;  
 float f;  
 double d;  
 //将整型浮点型数据运算之后赋值给指针类型  
 pPoint = c + c;  
 pPoint = s + s;  
 pPoint = i + i;  
 pPoint = l + l;  
 pPoint = f + f;  
 pPoint = d + d;  
 return 0;  
} 如下图所示:

同类型运算中:
那么我们把不同类型数据类型进行运算后赋值呢?
//vs2019  
//来源:技术让梦想更伟大  
//作者:李肖遥  
#include <stdio.h>  
int main()  
{  
 //定义一个整型指针变量pPoint  
 int* pPoint; 
 //定义基本的数据的类型  
 char c;  
 short s;  
 int i;  
 long l;  
 float f;  
 double d;  
 //将整型浮点型数据混合运算赋值给指针类型  
 pPoint = c + s;  // char + short = int  
 pPoint = c + i;  // char + intint = int  
 pPoint = c + l;  // char + long = int  
 pPoint = c + f;  // char + float = long  
 pPoint = c + d;  // char + double = float  
 return 0;  
} 结果如下图所示:

可以得出在不同类型运算中:
我们得到结论如图:

int -> unsigned int -> long -> unsigned long -> long long -> unsigned long long
float -> double
自动转换规则:
强制类型转换
强制类型转换是通过类型转换运算来实现的。其一般形式为:
(类型说明符) (表达式)
其作用就是把表达式的运算结果强制转换成类型说明符所表示的类型的值。
//vs2019  
//来源:技术让梦想更伟大  
//作者:李肖遥  
#include<stdio.h>  
#include<string.h>  
int main()  
{  
    float f,x=1.3,y=1.4;  
    int i = 4,a,b;  
    a = x + y;  
    b = (int)(x+y);  
    f = 10/i;  
    printf("a=%d,b=%d,f=%f,x=%f,y=%f\n",a,b,f,x,y);  
} 运行结果如下:


我们从中可以看到,虽然x,y变强制转换int型,但是最后输出的值不变,强制类型转换没有影响x和y变量原本的类型。而上图警告已经说明了一切。
注意:在C语言中,对一个变量赋值的时候,这个变量初始定义的类型包含了两层含义: