程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> printf的題目,printf

printf的題目,printf

編輯:關於C語言

printf的題目,printf


以前學習於淵老師的《自己動手寫操作系統》一書的時候,也自己實現過printf,不過那是比較簡單的版本。最近看《程序員面試寶典》,做到這麼一道題目:
#include <stdio.h>
int main{
    printf("%f",5);
    printf("%d",5.01);
}

問題是輸出什麼?
題目不難但很細節:第一個輸出0.000000,因為printf函數遇到%f,認為參數是個double類型(printf函數中float自動轉為double),而5是個int型,只有四位,那麼輸出取8位發生越界,輸出0.000000,第二個輸出是只取四位,輸出一個較大的數。

於是我想:printf("%f %d",5,5.01);會是什麼呢

事實上輸出兩個都是大數,只不過第一個輸出浮點數後面有很多0,第二個輸出則和前面的第二個輸出一樣

個人觀點分析其原因:

首先棧是向下生長的,而printf函數(其實是所有函數)參數入棧都是從右往左的,那麼5.01先入棧,5再入,也就是5.01在高地址,5在低地址,輸出%f的時候,取5所占的全部位和5.01的低四字節,輸出一個大數,輸出%d取高字節,也輸出一個大數。http://hovertree.com/menu/c/
為了直觀地看出這種分析:
我們用下面語句做測試:

printf("%f  %d",5,120.5);

其中:120.5的存儲格式如下:

0 100 0000 0101 1110 0010 0000 0000  0000     0000 0000 0000 0000 0000 0000 0000 0000
低4字節全是0,高4字節是個大數,
所以輸出應該是0.000000和一個大數
實際輸出如下:

推薦:http://www.cnblogs.com/roucheng/p/cfenge.html

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved