【請(qǐng)教】類型轉(zhuǎn)換中會(huì)有很多問(wèn)題,如下代碼:
#include <stdio.h>
int main()
{
? ? double num = 2.5; ? ? ?//定義浮點(diǎn)型變量num1并賦值為2.5
? ? printf("num的整數(shù)部分是%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;
}
【結(jié)果是:】
num的整數(shù)部分是2
4196047
4196051
4196051
num2 = num :
2
2.500000
2.5
【個(gè)人分析:】
前幾個(gè)輸出4196074是因?yàn)榍耙还?jié)說(shuō)的 ?占字節(jié)大的數(shù)轉(zhuǎn)換為小的數(shù)會(huì)出錯(cuò)
而后面輸出int型的num2會(huì)輸出2.5,這個(gè)。。。是因?yàn)槭裁囱嚼蠋煟?/p>
2015-02-08
你在第一個(gè)printf中是用強(qiáng)制類型轉(zhuǎn)換的方式將num轉(zhuǎn)換成int型傳入,不過(guò)準(zhǔn)確的說(shuō),在第二個(gè)printf中并不存在類型轉(zhuǎn)換。
因?yàn)閜rintf中%d代表它希望相應(yīng)的參數(shù)類型為int,如果你傳入的不是int型,一般來(lái)說(shuō)編譯器會(huì)給出警告的,通常仍可編譯通過(guò),但是在運(yùn)行時(shí)printf函數(shù)仍然把那個(gè)參數(shù)當(dāng)作int型來(lái)讀取和打印。一般計(jì)算機(jī)中int和double的存儲(chǔ)方式是不一樣的,所以造成打印出很“奇怪”的數(shù)。
而那個(gè)num2,你用了一個(gè)double類型的num來(lái)初始化,所以編譯器會(huì)先把num轉(zhuǎn)換成int型來(lái)給num2作初值。轉(zhuǎn)換方式就是截掉小數(shù)部分,所以num2的值就是2,類型就是int。
因此printf("%d \n",num2)打印出的結(jié)果很正確。同樣的道理,后面的printf就依照錯(cuò)誤的格式化字符錯(cuò)誤地打印了,結(jié)果并不一定是2.5,實(shí)際上打印出什么都有可能。