這段代碼:
#include <stdio.h>
int main(void)
{
printf("%a\n", 1.0);
printf("%x\n", 93);
}
輸出:
0x1p 0
5d
為什么不0x5d
呢?
有人知道原理嗎?
注意:這個問題并不完全相同,因為它是關于%#x
.
uj5u.com熱心網友回復:
我認為您只能選擇是否擁有 0x。使用 時%x
,您會收到原始的十六進制數。但是當您使用 時,您會收到帶有前綴%#x
的十六進制數字。0x
你選擇什么取決于情況。
uj5u.com熱心網友回復:
"%a"
,"%A"
前導"0x"
,"0X"
以幫助將其與"%f"
, "%e"
, "%g"
, "%F"
...的十進制輸出區分開
"%a"
來。
"%x"
沒有前綴的引導,因為代碼需要連接十六進制輸出,如 中printf("xx", a32, b32);
用"0x"
then 作為前綴是微不足道的"0xxx"
。在過去(1970 年代),不將十六進制輸出作為默認值肯定更常見,因為每個位元組都需要花費.
使用#
with "%x"
as in"%#x"
并不總是輸出前綴。當值非零時出現前綴(與數字相同)。
為清楚起見,我發現小寫x
和大寫十六進制數字很有用。
// v------ lower --------v
printf("0xX\n", 0u-1u); // 0xFFFFFFFF
// ^-- upper ---------^^^^^^^^
uj5u.com熱心網友回復:
正如@Jack05所解釋的,“#”字符有所不同。printf的手冊解釋了轉換:
每個轉換說明由字符 % 引入,并以轉換說明符結束。在兩者之間可能有(按此順序)零個或多個標志、一個可選的最小欄位寬度、一個可選的精度和一個可選的長度修飾符。
轉換規范的整體語法是:%[$][flags][width][.precision][length modifier]conversion
如果標志字符設定為“#”,則:
對于 x 和 X 轉換,非零結果的前面帶有字串“0x”(或 X 轉換的“0X”)。
對于“a”或“A”轉換,
double 引數轉換為樣式為 [-]0xh.hhhhp±d 的十六進制表示法(使用字母 abcdef);對于 A 轉換前綴 0X,字母 ABCDEF
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/442965.html
上一篇:c中的二進制加法與字符陣列