In article <bt********************@fe3.news.blueyonder.co.u k>

I use %#08x to print unsigned integers in hexadecimal format. ...

#08 stands for "pad the number with up to 8 zeroes to complete

it to 8 digit number". Is this correct understanding?

Almost. See below ...

Robert Harris <ro*************@blueyonder.co.uk> wrote:Bi*************@gmail.com wrote:

The # is a flag prefixing "0x" to the result

The 8 is the minimum field width (but some of the field may consist of

spaces before the "0x"). You really need a precision of 8 and a field

width of 10 (to include the "0x", so you need: "%#10.8x"

Both of these are correct but incomplete.

As Jordan Abel pointed out elsethread, the "#" flag ("alternate

form") only applies the prefix is the number is nonzero (for both

octal and hex conversions, in fact). ("Alternate form" has different

meanings for floating-point formats as well.)

The "0" in "08" is also a flag, meaning "pad with zeros instead of

blanks" (for numeric conversions -- the effect is undefined for

conversions like %s). To include a zero flag, it must (obviously)

appear before a numeric field width: "%09d" means "pad with zeros,

9 wide, decimal" but "%90d" means "pad with blanks, 90 wide,

decimal". The zero flag only applies for right-justified fields;

if you specify both the "-" flag and the "0" flag, the "0" flag is

ignored: "%-9d" and "%-09d" mean the same thing (as does "%0-9d").

Using a precision, as in Robert Harris' example above, is roughly

equivalent to specifying the zero flag. But it is not exactly the

same. For instance:

printf("5.2d: >%5.2d<\n", 5);

printf("05d: >%05d<\n", 5);

prints lines with "> 05<" and ">00005<" respectively.

Using "%#10.8x" will do the Right Thing for all nonzero numbers:

printf("*%#10.8x*\n", 0x4321); /* prints *0x00004321* */

but for 0 you get:

printf("*%#10.8x*\n", 0); /* prints * 00000000* */

Note that the 0x has disappeared (as required for "%#x" format),

so 10.8 -- a field width of 10, with a precision of 8 -- now pads

with blanks.

You could leave out the field width ("%#.8x"), but then nonzero

numbers will occupy 10 character fields (8 digits plus the leading

0x) while zero will use 8 character (8 digits, no leading 0x).

You could even write "%#010.8x" and hope for zero padding when

the 0x is omitted, but this seems ... wrong. :-)

The two "best" alternatives are likely "0x%.8x" or "0x%08x",

which will do exactly the same thing.

--

In-Real-Life: Chris Torek, Wind River Systems

Salt Lake City, UT, USA (40°39.22'N, 111°50.29'W) +1 801 277 2603

email: forget about it

http://web.torek.net/torek/index.html
Reading email is like searching for food in the garbage, thanks to spammers.