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类型最大精度值,所以按默认六位小数进行输出。