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


若運行時從鍵盤上輸入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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM