2013-03-11 37 views
3

我最近絆倒了這樣的代碼:對於printf的整數參數,零填充寬度和精度是否相同?

uint32_t val; 
... 
printf("%.08X", val); 

這是混淆了我。我的意思是,要麼指定0 +寬度或指定精度,兩者的意義何在?

Width

寬度參數...控制字符 輸出的最小數目。如果輸出值中的字符數小於指定寬度的 ,則會添加空白...。如果寬度的前綴爲 0,則會添加前導零...。

寬度指定永遠不會導致值被截斷。 ...

Precision

...它由一個週期的隨後的非負十進制 整數,這取決於轉換類型,指定...的(。) 要輸出的有效位數。

類型決定的精度無論是解釋或 默認精度省略精密的情況...

d, i, u, o, x, X - 精度指定要被打印的 的最小位數。如果參數中的位數比精度小 ,則輸出值將在左側用零填充。當位數超過精度時, 值不會被截斷。

所以我要麼使用"%08X""%.8X""%.08X"沒有任何意義,我。

但它似乎確實沒有什麼區別,就是說,所有三個變體看起來都會產生相同的輸出。

回答

3

你是正確的:

"%08X""%.8X""%.08X"

是等價的。

至於爲什麼 - 參考此:

http://www.cplusplus.com/reference/cstdio/printf/

因此:

在情況1中,這一個使用指定寬度:

的最小數量要打印的字符。如果要打印的值 小於此數字,則結果將填充空白。 即使結果較大,值也不會被截斷。

因此:

%08X將打印最小的8個字符

並從該參考:

對於整數說明符(d,I,O,U,X ,X):precision指定要寫入的最小位數 。如果要寫入的值是短於此數字的 ,則結果將用前導零填充。即使結果更長, 值也不會被截斷。精度爲0 表示沒有爲0值寫入字符。對於a,A,e,E,f 和F說明符:這是在小數點後 之後要打印的位數(默認情況下爲是6)。對於g和G說明符:這是 要打印的有效數字的最大數目。對於s:這是 要打印的最大字符數。默認情況下,所有 字符都會被打印,直到遇到結束空字符。 如果指定的時間段沒有明確的精度值,則假定爲0 。

%.8X使用精度說明符。因此,它也會打印至少8個字符。

最後一點:

%.08X也將打印至少8個字符(再次,因爲精度說明的)。爲什麼?因爲08被解釋爲8 - 導致與以前相同的輸出。這似乎並不做單位精度規格輸出感,但在這樣的情況下:

%0.15X

可以問題。

這些不同的形式存在,允許輸出的更精細的控制(這在我看來 - 是一個結轉類似的Fortran很多)。

但是,正如您發現的那樣,對精度進行更精細控制的這種過度補償允許您獲得相同的輸出 - 但具有不同的標誌。

UPDATE:

由於HVD所指出的,我忘了提:在X符需要一個無符號值,所以在這種情況下,你的輸出是%08X%.8X相同(由於那裏是沒有徵兆)。但是,對於像%08d%.8d-,它不是:一個填充到8個數字,另一個填充到8個字符,因此它們對於負值的行爲不同。

+0

這並不回答問題*爲什麼*它是這樣定義的,它只是表明它是。我會對OP的問題感興趣:「...兩者都有什麼意義?「 – 2013-03-11 07:18:59

+0

@DanielFrey,編輯 – jrd1 2013-03-11 07:20:10

+1

請注意,雖然'%08X'和'%.8X'表示同樣的事情,'%08d'和'%.8d'不會:一個打到8位數,另一個打到8字符,所以它們對於負值的行爲是不同的,'X'取一個無符號的值,所以它從來沒有符號 – hvd 2013-03-11 07:44:27