Menu Close

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

数据类型转换就是将数据(变量、表达式的结果)从一种类型转换到另一种类型。

C语言强制数据类型转换

例如,为了保存小数你可以将int类型的变量转换为double类型。

(type_name) expression

type_name为要转换到的数据类型,expression为表达式。例如:

(float) a; //把a转换为实型
(int)(x+y); //把x+y的结果转换为整型
(float) 100; //将一个常量转换为实型,浮点数

例1. 将整数转换为浮点数:

#include <stdio.h>
int main()
{
    int sum = 17, count = 5;
    double mean;
    mean = (double) sum / count;
    printf("Value of mean : %f\n", mean);
    return 0;
}

运行结果:

Value of mean : 3.400000

需要注意的是,类型转换运算符( )的优先级高于/,(double) sum / count会先将 sum 转换为 double 类型,然后再进行除法运算。如果写作(double) (sum / count),那么运行结果就是 3.000000。

例2. 将整数转换为浮点数:

#include <stdio.h>
int main()
{
    int sum = 17, count = 5;
    double mean;
    mean = (double)( sum / count);
    printf("Value of mean : %f\n", mean);
    return 0;
}

运行结果:

Value of mean : 3.000000

这种由程序员显式进行的转换称为强制类型转换。

除了强制类型转换,在不同数据类型的混合运算中编译器也会隐式地进行数据类型转换,称为自动类型转换。

c语言自动数据类型转换

自动类型转换遵循下面的规则:

  • 若参与运算的数据类型不同,则先转换成同一类型,然后进行运算。
  • 转换按数据长度增加的方向进行,以保证精度不降低。例如int型和long型运算时,先把int量转成long型后再进行运算。
  • 所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。
  • char型和short型参与运算时,必须先转换成int型。
  • 在赋值运算中,赋值号两边的数据类型不同时,需要把右边表达式的类型将转换为左边变量的类型。如果右边表达式的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度。

下图表示了C语言数据类型自动转换的规则:

下图表示了C语言数据类型自动转换的规则
下图表示了C语言数据类型自动转换的规则

例3.自动数据类型转换

#include<stdio.h>
int main()
{
   float PI=3.14159;
   int s1, r=5;
   double s2;
   s1 = r*r*PI;
   s2 = r*r*PI;
   printf("s1=%d, s2=%f\n", s1, s2);
   return 0;
}
s1=78, s2=78.539749

在计算表达式r*r*PI时,r 和 PI 都转换成double类型,表达式的结果也为double类型。但由于 s1 为整型,所以赋值运算的结果仍为整型,舍去了小数部分。
注意是将小数部分直接丢掉,而不是按照四舍五入向前舍入。

例4. 无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。

#include<stdio.h>
int main(){
   float f=5.75;
   printf("(int)f=%d, f=%f\n",(int)f, f);
   return 0;
}

运行结果

(int)f=5, f=5.750000
READ  函数指针 - C语言
除教程外,本网站大部分文章来自互联网,如果有内容冒犯到你,请联系我们删除!

2 Comments

  1. 解析过程

    int a =5;
    存放:编译器给a分配4字节空间,并且将5按照int类型的存储方式转成二进制存到a所对应的内存空间中去(a做左值的);
    取值:我们printf去打印a的时候(a此时做右值),printf内部的vsprintf函数会按照格式化字符串(就是printf传参的第一个字符串参数中的%d之类的东西)所代表的类型去解析a所对应的内存空间,解析出的值用来输出。
    解析规则:存进去时是按照这个变量本身的数据类型来存储的(譬如本例中a为int所以按照int格式来存储);但是取出来时是按照printf中%d之类的格式化字符串的格式来提取的。此时虽然a所代表的内存空间中的10101序列并没有变(内存是没被修改的)但是怎么理解(怎么把这些1010转成数字)就不一定了。譬如我们用%d来解析,那么还是按照int格式解析则值自然还是5;但是如果用%f来解析,则printf就以为a对应的内存空间中存储的是一个float类型的数,会按照float类型来解析,值自然是很奇怪的一个数字了。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Leave the field below empty!

Posted in C语言教程

Related Posts