程式設計師面試寶典 printf如何讀入浮點數

2021-07-02 06:49:37 字數 2280 閱讀 7948

在講這個題目之前,預備知識,講一下,printf函式,輸入引數是讀入緩衝區儲存,再按照%?的格式從緩衝區中讀出資料,並據此格式解釋資料。

有了這個知識之後,在講程式設計師面試寶典上看到乙個題:

[cpp]view plain

copy

#include "stdio.h"

intmain(

intargc, 

char

* argv)  

輸出結果為:188978561  

然後開始研究為什麼會是這個數?

5.01是double型別,記憶體中佔8個位元組,儲存在緩衝區。而%d為整型,佔4個位元組,printf從緩衝區中讀入4位元組,先讀到低32位的資料。也就是說printf輸出的應該是5.01以double型別儲存數劇的低32位。為了檢驗此結果是否正確,對比5.01在記憶體中的表示與輸出。

[c-sharp]view plain

copy

#include "stdio.h"

intmain(

intargc, 

char

* argv)  

輸出為:  

1).0x70a3d70a  

2).0x40140a3d  

3).0x70a3d70a  

這也就證明了%d輸出了5.01的低32低。5.01的double型別,在記憶體的的表示為0x40140a3d70a3d70a。

事情看似也就完成了。

我又想,如果輸入是浮點型別的5.01f,又會發生什麼呢?

[cpp]view plain

copy

#include "stdio.h"

intmain(

intargc, 

char

* argv)  

輸出:  

1).0x40a051ec  

2).0x80000000  

我們發現,此時輸出的並不是浮點型別5.01f的記憶體的表示,這是為什麼呢?

然後看到乙個說法,是printf會把%f按double型別輸出,也就是說會把引數float型的轉成double型在輸出。

但現在並不是%f,當然用%f顯示的是正確的結果。於是我猜測,printf是將所在float型讀入的資料都自動的轉化為double型了,然後%f就按double處理,而我們這是%d,所以顯示的為float轉化為double型後的低4位元組。

驗證此想法:

[cpp]view plain

copy

#include "stdio.h"

intmain(

intargc, 

char

* argv)  

輸出:  

1).0x70a3d70a  

2).0x40140a3d  

3).0x80000000  

但是我們發現結果並不一樣,於是我又猜想,也是許printf將float轉化為double的方式與預設的方式不一樣

5.01d的預設的表示為:0x40140a3d70a3d70a,在上面已經說明了

[cpp]view plain

copy

#include "stdio.h"

intmain(

intargc, 

char

* argv)  

輸出為:  

0x80000000  

0x40140a3d  

與是發現printf將5.01f->5.01d的表示是:0x40140a3d80000000

接著就是看這兩個值是否都是為5.01了:

[cpp]view plain

copy

#include "stdio.h"

intmain(

intargc, 

char

* argv)  

輸出為:  

1).5.010000  

2).5.010000  

也就證明了0x40140a3d80000000,與0x40140a3d70a3d70a都是5.01d在機器中的表示。前者為5.01f(0x40a051ec)由printf轉化為double後的表示,後者為5.01d的預設的表示。

總結:printf將輸的浮點型引數全都自動轉化為雙精度型,且與預設的雙精度的表示方法是不同的。最重要一點,printf不安全,型別不安全,要是型別不對了,也許我們就掛了^_^

程式設計師面試寶典

據統計,80 的簡歷都是不合格的。不少人事管理者抱怨收到的許多簡歷在格式上很糟糕。簡歷應該如何做到在格式上簡潔明瞭,重點突出?求職信應該如何有足夠的內容推銷自己?如何控制長度,言簡意賅?相信讀了本章你會對簡歷的撰寫有乙個新的認識。2.1 簡歷注意事項 1 簡歷不要太長 一般的簡歷普遍都太長。其實簡歷...

《程式設計師面試寶典》摘記

簡歷注意事項 1.簡歷不要太長 中文簡歷壓縮在 2頁左右就可以把所有的內容突出了。一般來說學習經歷應該從大學開始寫起。2.如實填寫。3.不要過分謙虛,不要把自己的一切包括弱項都寫進去。4.求職簡歷上一定要註明求職的職位。根據所申請的職位來設計,突出你在這方面的優點。編寫乙份或者幾份有針對性的簡歷。5...

程式設計師面試寶典一

1 int i i 首先宣告乙個變數i,然後將變數i的值 未初始化 賦值給自己 2 下面 的意義 void func int x,int count 求乙個整數轉換為二進位制之後包含多少個1 3 printf在vc6.0下是自右向左運算的 好像跟編譯器有關 int arr int ptr arr p...