This code:
#include <stdio.h>
int main(void)
{
printf("%a\n", 1.0);
printf("%x\n", 93);
}
outputs:
0x1p+0
5d
Why not 0x5d?
Does someone know the rationale?
Note: this question is not exactly the same since it is about %#x.
Reason of the question: for %x cannot always "feed it back to C in initializer":
$ cat t324.c
#include <stdio.h>
int main(void)
{
printf(X);
}
$ gcc t324.c -DX="\"double x = %a;\", 10.0" && ./a.exe | gcc -xc - -c
<nothing>
$ gcc t324.c -DX="\"int x = %x;\", 10" && ./a.exe | gcc -xc - -c
<stdin>:1:9: error: ‘a’ undeclared here (not in a function)
"%a","%A"leads with"0x","0X"to help distinguish it from decimal output of"%f","%e","%g","%F", ...Note
"%a"instead of say"%e", affect 2 parts, the prefix and the base letter:"0x"and"p"instead of""and"e"."%a"came along well after memory prices dropped."%x"leads without a prefix as often code needs to concatenate hex output as inprintf("%08x%08x", a32, b32);It is trivial to prefix with"0x"then as in"0x%08x%08x". Not prefixing hex output as the default was certainly more common, back in the day (1970s) as every bytes costs.Using
#with"%x"as in"%#x"does not always prefix output. The prefix occurs (in the same case as digits) when the value is non-zero.For clarity, I find a lower case
xand uppercase hex digits useful.