您的位置:首页 > 编程语言 > C语言/C++

C语言中的类型转换

2016-02-27 18:13 501 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: