printf以 d形式輸出浮點數的問題

2021-08-18 09:07:56 字數 1062 閱讀 3045

若執行時從鍵盤上輸入9876543210l,則下面程式的輸出結果是

#include

int main()

a.a=98,b=765,c=4321.000000

b.a=98,b=0,c=0

c.a=98,b=765.000000,c=4321.000000

d.a=98,b=765.0,c=4321.0

printf函式執行的時候,會先把這三個數字壓入棧裡,然後再執行列印。壓入棧的時候按照資料本身的長度來,首先把c和b壓入,並且每乙個都是8個位元組(printf自動轉化為double)。然後再壓入a是4個位元組。然後再執行列印。列印的時候按照使用者指定的格式來出棧。首先列印a,a列印正常。然後又列印4個位元組長度的b,在棧裡面由於b長度是八個位元組,並且b目前是64位的表示方式,資料的後面全是0.(float 變double),電腦是小端儲存方式,0儲存在距離a近的地方。列印b的時候,列印的4個位元組都是0.然後再列印c,c用正常的方式列印,會一下子讀取8個位元組,正好,讀出來的八個位元組前面四個位元組全是0,自己可以算一下,實在太小了,因此為0。

棧底                                   棧頂 

高位元組 低位元組

4321

0000

7650000

984位元組 4位元組 4位元組 4位元組 4位元組

列印c 列印b 列印a

附:浮點數(單精度的float和雙精度的double)在記憶體中以二進位制的科學計數法表示,表示式為n = 2^e * f;其中e為階碼(採用移位儲存),f為尾數。

float和double都由符號位、階碼、尾數三部分組成,float儲存時使用4個位元組,double儲存時使用8個位元組。各部分占用位寬如下所示:

符號位     階碼      尾數     長度 

float18

2332

double111

5264

printf如何讀入浮點數

在講這個題目之前,預備知識,講一下,printf函式,輸入引數是讀入緩衝區儲存,再按照 的格式從緩衝區中讀出資料,並據此格式解釋資料。有了這個知識之後,在講程式設計師面試寶典上看到乙個題 然後開始研究為什麼會是這個數?5.01是double型別,記憶體中佔8個位元組,儲存在緩衝區。而 d為整型,佔4...

1 1輸出浮點數

描述讀入乙個雙精度浮點數,分別按輸出格式 f f 保留5位小數,e 和 g 的形式輸出這個整數,每次在單獨一行上輸出。輸入乙個雙精度浮點數。輸出輸出有四行 第一行是按 f 輸出的雙精度浮點數 第二行是按 f 保留5位小數輸出的雙精度浮點數 第三行是按 e 輸出的雙精度浮點數 第四行是按 g 輸出的雙...

C11 1 浮點數輸出

100 100 分數 題目描述 編寫乙個程式,輸入乙個浮點數和輸出格式要求,按照格式要求將該浮點數輸出。給定非負整數m和n,表示輸出的浮點數小數點前的寬度為m,若寬度不夠則在前面補0,小數點後的寬度為n,若寬度不夠則在後面補0 補充說明 當n 0時,只需輸出整數部分,當m,n都為0時,則輸出0 輸入...