printf 函數問題


int main()
{
     double n = 1.2;
    printf("%f\n", n);
    printf("%lf", n);
    return 0;
}

輸出結果如下:

苦思不得其解,轉向度娘,尋得些許意見:該問題的出現應該與編譯器及C語言標準有關

http://www.cnblogs.com/mayswind/p/3473353.html


printf()函數使用%f格式說明符打印十進制計數法的float和double數字,用%e打印指數計數法的數字。

打印long double類型需要%Lf、%Le、和%La說明符。

注意:float和double類型的輸出都使用%f說明符.


一樣的問題:

http://www.cnblogs.com/chucklu/p/4021575.html

include <stdio.h>
main()
{
printf("%f\n",5);
}
爲什麼屏幕輸出的結果是0.000000,但是如果是(float)5,結果就正確,請詳細說明
用cc編譯printf("%f\n",5)爲什麼是0.000000,而不是5.000000,哪方面的問題,編譯器、系統,還是說C語言本身就有這個問題,請詳細說明原因


1,之所以沒輸出5,這是C語言設計的原因。
2,之所以輸出0,這是計算機體系結構的問題。

具體來說:

printf函數不會進行任何類型轉換,它只是從內存中讀出你所提供的元素的值(按照%d,%f等控制字符提示的格式)。C語言設計中,int類型一般是32bit或者16bit,而float一般是64bit,並且有可能使用科學計數保存。這點就和huhugo88所說一樣,5在內存中爲00000000,00000101。而且5一般都在靜態區,程序的靜態存儲區默認是0,那麼當用%f來讀時,就會讀64bit,也就是會讀之前的很多位0,最後按照(有效數字)×(基數2)pow(指數)的方式來取數,自然結果是0

之所以Vc中不允許這種情況,而有些編譯器就允許這麼輸出就是編譯器設置的問題。按理說,這樣訪問內存是屬於越界訪問,應該禁止。不過只是讀,傷害性不大而已。

發佈了46 篇原創文章 · 獲贊 25 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章