在講這個題目之前,預備知識,講一下,printf函式,輸入引數是讀入緩衝區儲存,再按照%?的格式從緩衝區中讀出資料,並據此格式解釋資料。
有了這個知識之後,在講程式設計師面試寶典上看到乙個題:
然後開始研究為什麼會是這個數?
5.01是double型別,記憶體中佔8個位元組,儲存在緩衝區。而%d為整型,佔4個位元組,printf從緩衝區中讀入4位元組,先讀到低32位的資料。也就是說printf輸出的應該是5.01以double型別儲存數劇的低32位。為了檢驗此結果是否正確,對比5.01在記憶體中的表示與輸出。
這也就證明了%d輸出了5.01的低32低。5.01的double型別,在記憶體的的表示為0x40140a3d70a3d70a。
事情看似也就完成了。
我又想,如果輸入是浮點型別的5.01f,又會發生什麼呢?
我們發現,此時輸出的並不是浮點型別5.01f的記憶體的表示,這是為什麼呢?
然後看到乙個說法,是printf會把%f按double型別輸出,也就是說會把引數float型的轉成double型在輸出。
但現在並不是%f,當然用%f顯示的是正確的結果。於是我猜測,printf是將所在float型讀入的資料都自動的轉化為double型了,然後%f就按double處理,而我們這是%d,所以顯示的為float轉化為double型後的低4位元組。
驗證此想法:
但是我們發現結果並不一樣,於是我又猜想,也是許printf將float轉化為double的方式與預設的方式不一樣
5.01d的預設的表示為:0x40140a3d70a3d70a,在上面已經說明了
與是發現printf將5.01f->5.01d的表示是:0x40140a3d80000000
接著就是看這兩個值是否都是為5.01了:
也就證明了0x40140a3d80000000,與0x40140a3d70a3d70a都是5.01d在機器中的表示。前者為5.01f(0x40a051ec)由printf轉化為double後的表示,後者為5.01d的預設的表示。
總結:printf將輸的浮點型引數全都自動轉化為雙精度型,且與預設的雙精度的表示方法是不同的。最重要一點,printf不安全,型別不安全,要是型別不對了,也許我們就掛了^_^
程式設計師面試寶典 printf如何讀入浮點數
在講這個題目之前,預備知識,講一下,printf函式,輸入引數是讀入緩衝區儲存,再按照 的格式從緩衝區中讀出資料,並據此格式解釋資料。有了這個知識之後,在講程式設計師面試寶典上看到乙個題 cpp view plain copy include stdio.h intmain intargc,char...
浮點數如何比較
從鍵盤輸入一指定金額 以元為單位,如345.78 然後顯示支付該金額的各種面額人民幣數量,要求顯示100元 50元 10元 5元 2元 1元 1角 5分 1分各多少張。include include include int main else if x 50 else if x 10 else if...
浮點數 儲存
關鍵字 體系結構 ieee754 浮點數 儲存 main 如果不執行上面的 讓我們來直接判斷,輸出的結果會是什麼?而在你執行程式之後,結果卻很讓人詫異 123.456001。為什麼會是123.456001?有六位小數可以理解,最後那個1是為何?有很多人解釋說最後那個1是亂碼,隨機的。嘿嘿 其實無論你...