问答详情
源自:2-9 强制类型转换

【请教】类型转换中会有很多问题,如下代码:

#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,这个。。。是因为什么呀老师?

提问者:林泽华 2015-02-07 13:53

个回答

  • onemoo
    2015-02-08 22:56:08
    已采纳

    你在第一个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,实际上打印出什么都有可能。