C语言中的数据类型转换是将一种数据类型转换为另一种数据类型的过程。数据类型转换分为两类,分别是自动数据类型转换和强制数据类型转换。自动转换时程序根据运算要求进行的转换,不需要人工干预。强制数据类型转换是根据程序需要,由编写程序人员人为改变数据类型的方式。本文主要介绍C语言数据类型转换(自动转换、强制转换)。

1、隐式类型转换(自动转换)

在多种数据类型混合计算的时候,不需要程序员控制类型,系统会自动进行类型转换

转换,隐式转换的规则是:存储长度较短的转换成存储长度较长的,且不丢失数据。

bool - > char - > short int - > int - > unsigned int - > long - > unsigned - > long long - > float - > double - > long double

例如,

#include<stdio.h> 
int main() 
{ 
    int x = 10;    
    char y = 'a';  
    // 'a' is 97 
    x = x + y; 
    float z = x + 1.0; 
    printf("x = %d, z = %f", x, z); 
    return 0; 
} 

赋值转换:如果赋值运算符两侧数据类型不一致,则在赋值时会发生赋值类型转换。

例如,

#include<stdio.h>
int main()
{
    int a1 = 3.5;
    //此时a的值是3
    float f1 = 4;
    //此时f的值是4.0
    int a, b;
    double x = 1.54;
    char ch;
    a = x;
    x = 12;
    b = 'a';
    ch = 356;
    printf("a=%d\nx=%f\nb=%d\nch=\'%c\'\n",a,x,b,ch);
    return 0;
}

2、强制类型转换

强制类型转换是通过类型转换运算来实现的。其一般形式为:(类型说明符)(表达式)其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。自动转换是在源类型和目标类型兼容以及目标类型广于源类型时发生一个类型到另一类的转换。例如: (float)aa转换为浮点型,(int)(x+y)x+y的结果转换为整型。

例如,

#include<stdio.h> 
int main() 
{ 
    double x = 1.2; 
    int sum = (int)x + 1; 
    printf("sum = %d", sum); 
    return 0; 
} 

3、隐式和显式类型转换的区别

C语言中,隐式类型转换显式类型转换是两种不同的类型转换机制。它们之间的主要区别在于转换是否是由编译器自动完成,还是由程序员手动指定的。显式类型转换能更好地控制运算结果,但需要程序员更加小心地处理数据类型之间的转换。

#include <stdio.h>

int main() {
    int a = 5;
    int b = 2;

    // 隐式转换
    // 整数除法,结果是 2,
    // 隐式转换后 result1 存储 2.0
    float result1 = a / b;  
    printf("隐式转换结果: %f\n", result1);

    // 显式转换
    // 显式将 a 转换为 float,结果是 2.5
    float result2 = (float)a / b; 
    printf("显式转换结果: %f\n", result2);

    return 0;
}

4、常用类型转换函数

atof(将字符串转换成浮点型数)

头文件:#include <stdlib.h>

定义函数:double atof(const char *nptr);

函数说明:atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('')才结束转换,并将结果返回。参数nptr字符串可包含正负号、小数点或E(e)来表示指数部分,如123.456或123e-2。

返回值:返回转换后的浮点型数。

附加说明:atof()与使用strtod(nptr,(char**)NULL)结果相同。

例如,

/* 将字符串a 与字符串b转换成数字后相加*/
#include<stdlib.h>
int main(void)
{
    char *a = "-100.23";
    char *b = "200e-2";
    float c;
    c = atof(a) + atof(b);
    printf("c=%.2f\n",c);
    return 0;
}

atoi(将字符串转换成整型数)

头文件:#include<stdlib.h>

定义函数:int atoi(const char *nptr);

函数说明:atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('')才结束转换,并将结果返回。

返回值:返回转换后的整型数。

附加说明:atoi()与使用strtol(nptr,(char**)NULL,10);结果相同。

例如,

/* 将字符串a 与字符串b转换成数字后相加*/
#include<stdlib.h>
int main(void)
{
    char a[] = "-100";
    char b[] = "456";
    int c;
    c = atoi(a) + atoi(b);
    printf("c = %d\n", c);
    return 0;
}

atol(将字符串转换成长整型数)

头文件:#include<stdlib.h>

定义函数:long atol(const char *nptr);

函数说明:atol()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('')才结束转换,并将结果返回。

返回值:返回转换后的长整型数。

附加说明:atol()与使用strtol(nptr,(char**)NULL,10);结果相同。

例如,

/*将字符串a与字符串b转换成数字后相加*/
#include<stdlib.h>
int main(void)
{
    char a[] = "1000000000";
    char b[] = "234567890";
    long c;
    c = atol(a) + atol(b);
    printf("c=%d\n",c);
    return 0;
}

gcvt(将浮点型数转换为字符串,取四舍五入)

头文件:#include<stdlib.h>

定义函数:char *gcvt(double number,size_t ndigits,char *buf);

函数说明:gcvt()用来将参数number转换成ASCII码字符串,参数ndigits表示显示的位数。gcvt()ecvt()fcvt()不同的地方在于,gcvt()所转换后的字符串包含小数点或正负符号。若转换成功,转换后的字符串会放在参数buf指针所指的空间。

返回值:返回一字符串指针,此地址即为buf指针。

例如,

#include<stdio.h>
#include<stdlib.h>
 
 
int main()
{
    int num_int = 95;
    double num_double = 95.12f;
    char str_int[30];
    char str_double[30];
    
    gcvt(num_double, 8, str_double);
    printf("str_double :%s\n", str_double);

}

strtod(将字符串转换成浮点数)

头文件:#include<stdlib.h>

定义函数:double strtod(const char *nptr,char **endptr);

函数说明:strtod()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,到出现非数字或字符串结束时('')才结束转换,并将结果返回。若endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr传回。参数nptr字符串可包含正负号、小数点或E(e)来表示指数部分。如123.456或123e-2。

返回值:返回转换后的浮点型数。

例如,

/*将字符串a,b,c 分别采用10,2,16 进制转换成数字*/
#include<stdlib.h>
#include<stdio.h>
void main()
{
    char *endptr;
    char a[] = "12345.6789";
    char b[] = "1234.567qwer";
    char c[] = "-232.23e4";
    printf( "a=%lf\n", strtod(a,NULL) );
    printf( "b=%lf\n", strtod(b,&endptr) );
    printf( "endptr=%s\n", endptr );
    printf( "c=%lf\n", strtod(c,NULL) );
}

strtol(将字符串转换成长整型数)

头文件:#include<stdlib.h>

定义函数:long int strtol(const char *nptr,char **endptr,int base);

函数说明:strtol()会将参数nptr字符串根据参数base来转换成长整型数。参数base范围从2至36,或0。参数base代表采用的进制方式,如 base值为10则采用10进制,若base值为16则采用16进制等。当base值为0时则是采用10进制做转换,但遇到如'0x'前置字符则会使用 16进制做转换。一开始strtol()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时('')结束转换,并将结果返回。若参数endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr返回。

返回值:返回转换后的长整型数,否则返回ERANGE并将错误代码存入errno中。

附加说明:ERANGE指定的转换字符串超出合法范围。

例如,

/* 将字符串a,b,c 分别采用10,2,16进制转换成数字*/
#include<stdlib.h>
int main(void)
{
    char a[] = "1000000000";
    char b[] = "1000000000";
    char c[] = "ffff";
    printf("a = %d\n" ,strtol(a,NULL,10));
    printf("b = %d\n", strtol(b,NULL,2));
    printf("c = %d\n", strtol(c,NULL,16));
    return 0;
}

strtoul(将字符串转换成无符号长整型数)

头文件:#include<stdlib.h>

定义函数:unsigned long int strtoul(const char *nptr,char **endptr,int base);

函数说明:strtoul()会将参数nptr字符串根据参数base来转换成无符号的长整型数。参数base范围从2至36,或0。参数base代表采用的进制方式,如base值为10则采用10进制,若base值为16则采用16进制数等。当base值为0时则是采用10进制做转换,但遇到如'0x'前置字符则会使用16进制做转换。一开始strtoul()会扫描参数nptr字符串,跳过前面的空格字符串,直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时('')结束转换,并将结果返回。若参数endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr返回。

返回值:返回转换后的长整型数,否则返回ERANGE并将错误代码存入errno中。

附加说明:ERANGE指定的转换字符串超出合法范围。

例如,

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int a;
    char pNum[]="0xFF";
    a=strtoul(pNum,0,0);//最后的0,表示自动识别pNum是几进制
    printf("%ul\n",a);
    return 0;
}

toascii(将整型数转换成合法的ASCII 码字符)

头文件:#include<ctype.h>

定义函数:int toascii(int c)

函数说明:toascii()会将参数c转换成7位的unsigned char值,第八位则会被清除,此字符即会被转成ASCII码字符。

返回值:将转换成功的ASCII码字符值返回。

例如,

#include<stdlib.h>
int main(void)
{
    int a = 217;
    char b;
    printf("before toascii () : a value  = %d(%c) " ,a ,a);
    b = toascii(a);
    printf("after toascii() : a value = %d(%c) " ,b ,b);
    return 0;
}

推荐文档