自动类型转换与强制类型转换

一,自动类型转换

自动类型转换:对于某些类型的转换编译器可隐式地自动进行,不需人工干预,自动类型转换

float f = 100;
//100 是 int 类型的数据,需要先转换为 float 类型才能赋值给变量 f。
int n = f;
//f 是 float 类型的数据,需要先转换为 int 类型才能赋值给变量 n。
//这些都是自动完成的

在赋值运算中,赋值号两边的数据类型不同时,需要把右边表达式的类型转换为左边变量的类型,这可能会导致数据失真,或者精度降低;所以说,自动类型转换并不一定是安全的。对于不安全的类型转换,编译器一般会给出警告。

记住下面的转换层次:

double float

long

unsigned int

intchar,short

解释:

  • ↑表示:转换按数据长度增加的方向进行,以保证数值不失真,或者精度不降低。例如,int 和 long 参与运算时,先把 int 类型的数据转成 long 类型后再进行运算。这些转换可以说是自动的,但尽量(确保自己允许转换发生)使用以显式的形式强制转换类型的机制。
  • ← 表示:所有的浮点运算都是以双精度进行的,即使运算中只有 float 类型,也要先转换为 double 类型,才能进行运算。
  • ← 表示:char 和 short 参与运算时,必须先转换成 int 类型。

例子:

#include 
 
int main()
{
   int  i = 1;
   char a = 'a'; /* ascii 值是 97 */
   int sum;
 
   sum = i + a;
   printf("%d\n", sum );
 
}

//结果:98

解释:编译器进行了整数提升,在执行实际加法运算时,把 ‘a’ 的值转换为对应的 ascii 值

#include 
 
int main()
{
   int  i = 1;
   char a = 'a'; /* ascii 值是 99 */
   float sum;
 
   sum = i + a;
   printf("%f\n", sum );
 
}

解释:a首先被转换为整数,但是由于最后的值是 float 型的,所以会应用常用的算术转换,编译器会把 i 和 a 转换为浮点型,并把它们相加得到一个浮点数


二,强制类型转换

强制类型转换:类型转换需要编程者显式指定

强制类型转换的格式为:(type_name) expression

例子:

#include 
 
int main()
{
   int sum = 17, count = 5;
   double avg;
   
   avg = (double) sum / count; //此处强转
   printf("%f\n",avg);
   
 //结果:3.400000
}

解释:
强制类型转换运算符的优先级大于除法,因此 sum 的值首先被转换为 double 型,然后除以 count,得到一个类型为 double 的值。

#include 
 
int main()
{
   int sum = 17, count = 5;
   double avg;
   
   avg = sum / count; //此处无强转
   printf("%f\n",avg);
   
 //结果:3.000000
}

解释:
此处没有强转,结果为3.000000,因为sum / count的结果为3,赋值给avg的时候自动转换为了double类型,输出为3.000000


三,类型转换只是临时性的

无论是自动类型转换还是强制类型转换,都只是为了本次运算而进行的临时性转换,转换的结果也会保存到临时的内存空间,不会改变数据本来的类型或者值。

#include 
int main(){
    double sum = 400.8;  //总价
    int count = 5;  //数目
    double price;  //单价
    int sumint = (int)sum;//强制转换,但是只在此刻有效
    price = sum / count;
    printf("sum=%lf, sumint=%d, price=%lf\n", sum, sumint, price);
    return 0;
}

//结果:sum=400.800000, sumint=400, price=80.160000

解释:
sum变量被转换成了 int 类型才赋值给 sumint 变量,而这种转换并未影响 sum 变量本身的类型和值。如果 sum 的值变了,那么 sum 的输出结果将变为 400.000000;price 的输出结果将变为 80.000000。


四,两者的区分

  • 可以自动转换的类型一定能够强制转换,但是,需要强制转换的类型不一定能够自动转换
  • 可以自动进行的类型转换一般风险较低,不会对程序带来严重的后果,例如,int 到 double 没有什么缺点,float 到 int 顶多是数值失真。只能强制进行的类型转换一般风险较高

补充:

  • 范围大的类型在一定情况下式可以转换为小类型的:大类型的数值在小类型的范围内,但是最好不要使用大转小,容易内存泄漏
  • 类型转换可以是隐式的,由编译器自动执行;也可以是显式的,通过使用强制类型转换运算符来指定。建议在编程时,有需要类型转换的时候都用上强制类型转换运算符

你可能感兴趣的:(一周学完C语言基础,c语言,c++,开发语言)