【請教】類型轉換中會有很多問題,如下代碼:
#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-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,實際上打印出什么都有可能。