1. 程式人生 > >printf以%d形式輸出浮點數的問題

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

小端 正常 main 輸出結果 csdn 都是 數字 浮點 計數

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

int main(){

int a;float b,c;

scanf("%2d%3f%4f",&a,&b,&c);

printf("\na=%d,b=%d,c=%f\n",a,b,c);

}

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 765 0000 98

4字節 4字節 4字節 4字節 4字節
打印c 打印b 打印a
附:浮點數(單精度的float和雙精度的double)在內存中以二進制的科學計數法表示,表達式為N = 2^E * F;其中E為階碼(采用移位存儲),F為尾數。
float和double都由符號位、階碼、尾數三部分組成,float存儲時使用4個字節,double存儲時使用8個字節。各部分占用位寬如下所示:
符號位 階碼 尾數 長度
float 1 8 23 32
double 1 11 52 64

http://blog.csdn.net/fzp218/article/details/8971701

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