#include <stdio.h>
int main()
{
double num = 2.5; //定义浮点型变量num1并赋值为2.5
printf("num的整数部分是%d\n", (int)num);
printf("%d \n",num);
printf("%d \n",2.5);
printf("%d \n",(float)2.5);
//*******
printf("\n\nnum2 = num :\n");
int num2 = num;
printf("%d \n",num2);
printf("%f \n",num2);
printf("%g \n",num2);
return 0;
}
【结果是:】
num的整数部分是2
4196047
4196051
4196051
num2 = num :
2
2.500000
2.5
【个人分析:】
前几个输出4196074是因为前一节说的 占字节大的数转换为小的数会出错
而后面输出int型的num2会输出2.5,这个。。。是因为什么呀老师?
你在第一个printf中是用强制类型转换的方式将num转换成int型传入,不过准确的说,在第二个printf中并不存在类型转换。
因为printf中%d代表它希望相应的参数类型为int,如果你传入的不是int型,一般来说编译器会给出警告的,通常仍可编译通过,但是在运行时printf函数仍然把那个参数当作int型来读取和打印。一般计算机中int和double的存储方式是不一样的,所以造成打印出很“奇怪”的数。
而那个num2,你用了一个double类型的num来初始化,所以编译器会先把num转换成int型来给num2作初值。转换方式就是截掉小数部分,所以num2的值就是2,类型就是int。
因此printf("%d \n",num2)打印出的结果很正确。同样的道理,后面的printf就依照错误的格式化字符错误地打印了,结果并不一定是2.5,实际上打印出什么都有可能。