在講這個題目之前,預備知識,講一下,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...