Length modifiers
suggest changeThe C99 and C11 standards specify the following length modifiers for printf()
; their meanings are:
Modifier | Modifies | Applies to |
|–––––|———————|—————————————————————| | hh | d, i, o, u, x, or X | char
, signed char
or unsigned char
| h | d, i, o, u, x, or X | short int
or unsigned short int
| l | d, i, o, u, x, or X | long int
or unsigned long int
| l | a, A, e, E, f, F, g, or G | double
(for compatibility with scanf()
; undefined in C90) | ll | d, i, o, u, x, or X | long long int
or unsigned long long int
| j | d, i, o, u, x, or X | intmax_t
or uintmax_t
| z | d, i, o, u, x, or X | size_t
or the corresponding signed type (ssize_t
in POSIX) | t | d, i, o, u, x, or X | ptrdiff_t
or the corresponding unsigned integer type | L | a, A, e, E, f, F, g, or G | long double
If a length modifier appears with any conversion specifier other than as specified above, the behavior is undefined.
Microsoft specifies some different length modifiers, and explicitly does not support hh
, j
, z
, or t
.
Modifier | Modifies | Applies to |
|–––––|———————|—————————————————————| | I32 | d, i, o, x, or X | __int32
| I32 | o, u, x, or X | unsigned __int32
| I64 | d, i, o, x, or X | __int64
I64 | o, u, x, or X | unsigned __int64
I | d, i, o, x, or X | ptrdiff_t
(that is, __int32
on 32-bit platforms, __int64
on 64-bit platforms)
I | o, u, x, or X | size_t
(that is, unsigned __int32
on 32-bit platforms, unsigned __int64
on 64-bit platforms) l or L | a, A, e, E, f, g, or G | long double
(In Visual C++, although long double
is a distinct type, it has the same internal representation as double
.)
l or w | c or C | Wide character with printf
and wprintf
functions. (An lc
, lC
, wc
or wC
type specifier is synonymous with C
in printf
functions and with c
in wprintf
functions.)
l or w | s, S, or Z | Wide-character string with printf
and wprintf
functions. (An ls
, lS
, ws
or wS
type specifier is synonymous with S
in printf
functions and with s
in wprintf
functions.)
Note that the C
, S
, and Z
conversion specifiers and the I
, I32
, I64
, and w
length modifiers are Microsoft extensions. Treating l
as a modifier for long double
rather than double
is different from the standard, though you’ll be hard-pressed to spot the difference unless long double
has a different representation from double
.