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
printf以%d形式輸出浮點數的問題