C语言中的类型转换

来源:互联网 发布:大众软件 故事合集 编辑:程序博客网 时间:2024/05/22 09:45

1.      C标准中没有对各种数据类型在内存中所占字节数做严格的定义,要想准确的计算某种类型数据所占用的内存大小,需要使用sizeof()运算符,这样可以避免程序在平台移植时出现数据丢失或者溢出的问题。[1]

2.      自动类型转换的几种情况:

1)  表达式中的类型提升

若参与运算量的类型不同,先转换成同一类型,然后进行运算,转换按数据长度增加的方向进行,即转换成该运算式中占内存字节最大的操作数类型,以保证精度不降低。(说明:char,short类型在运算时始终转换成int类型进行运算)

具体请看代码:

//测试环境:VS2015,win10,X64,debugwin32.

#include<stdio.h>

void  main()

{

  

   short s1 = 10;

   short s2 = 11;

   int i1 = 10;

   int i2 = 11;

   float f1 = 10.0;

   float f2 = 11.0;

   double d1 = 10.0;

   double d2 = 11.0;

   char  c1 = 'a';//a的ASCII的值为97

   char  c2 = 'b';//b的ASCII的值为98

   printf("数据类型     占用的字节数\n ");//分别输出在当前环境下各数据类型所占用的内存

   printf("short            %d\n", sizeof(short));

   printf("int              %d\n", sizeof(int));

   printf("float            %d\n", sizeof(float));

   printf("double           %d\n", sizeof(double));

   printf("char             %d\n", sizeof(char));

 

   printf("运算类型       运算结果    结果所占字节数\n");//分别输出不同类型运算的结果及其所占用的内存

   printf("short+short      %d\t\t%d\n", s1+s2,sizeof(s1+s2));

   printf("char+char        %d\t\t%d\n", c1 + c2, sizeof(c1 +c2));

   printf("char+short       %d\t\t%d\n", c1 + s1, sizeof(c1 +s1));

   printf("int+short        %d\t\t%d\n", i1+i2,sizeof(i1+s1));

   printf("float+float      %f\t%d\n", f1+f2,sizeof(f1+f2));

   printf("double+float     %f\t%d\n", d1+f1,sizeof(d1+f1));

   printf("int+float        %f\t%d\n", i1+f1,sizeof(i1+f1));

   printf("short+double     %f\t%d\n", s1 + d1, sizeof(s1 + d1));

  

}

运行结果:


2)  赋值中的类型转换

将右侧表达式的值转换成左边变量的类型,当左边的类型精度低于右边类型的精度时将发生精度丢失。

具体请看代码:

#include<stdio.h>

void main()

{

   short s = 100;

   int i = 100;

   float f = 100.999;

   double d = 100.999;

   d = i + s;//验证int类型和short类型运算赋值给double类型

   s = i + f;//验证int类型和float类型运算赋值给short类型

   printf("运算类型       运算结果    结果所占字节数\n");//分别输出不同类型运算的结果及其所占用的内存

   printf("double=int+short %f\t%d\n",d, sizeof(d));

   printf("short=int+float  %d\t\t%d\n", s, sizeof(s));

 

}

 测试结果:


3.      强制类型转换

1)  强制类型转换格式:(类型)表达式

具体请看代码:

#include<stdio.h>

void main()

{

   int i = 5;

   float f = 100.99;

   double d = 100.999999;

   f = (float)i + (int)d;

   printf("      运算类型                      运算结果    结果所占字节数\n");//分别输出不同类型运算的结果及其所占用的内存

   printf("f=(float)int+(int)double            %f\t%d\n", f,sizeof(f));//double类型因为使用(int)进行强制类型转换,将丢失小数部分。

   printf("(int)f=(float)int+(int)double      %d\t\t%d\n", (int)f,sizeof(f));//double类型因为使用(int)进行强制类型转换,将丢失小数部分。

 

}

测试结果:


2)  标准化格式输出中类型转换问题

在使用printf(“ ”)进行输出时,可以使用%d和%f等格式控制符进行输出。其中%d表示输出带符号的十进制数,正数的符号省略。%f以十进制输出实数(包括单、双精度),正数部分全部输出,小数部分默认输出6位。当输出对应类型的数据时,必须严格选择%d和%f控制符,不可以使用%d输出浮点型的数据,同样也不可以用%f输出整型数据,否则会发生未知错误。

具体请看代码:

#include<stdio.h>

void main()

{

   int i = 999;

   float f = 999.999999;//有效位一般为7位

   double d = 999.999999;//有效位一般为16位

 

   printf("正确输出的情况:\n");

   printf("int i=%d\n ", i);//将int类型以整型数形式输出

   printf("float f=%f\n", f);//将float类型以浮点数形式输出,

   printf("double d=%f\n", d);//将double类型以浮点数形式输出

 

   printf("错误输出的情况:\n");

   printf("int i=%f\n", i);//将int类型以浮点型输出

   printf("float f=%d\n", f);//将float类型以整型输出

   printf("double d=%d\n", d);//将double类型以整型输出

  

}

测试结果:


说明:因为在999.999999已经达到float类型的最大精度值,系统自动进行的进一的操作,但999.999999没有达到double类型最大精度值,所以按默认六位小数进行输出。



[1] 参见《C语言程序设计》第二版P18,高等教育出版社,苏小红2013

1 0
原创粉丝点击