长度修饰符
C99 和 C11 标准为 printf() 指定了以下长度修饰符; 它们的含义是:
| 修改符 | 修改 | 适用于 |
|---|---|---|
hh |
d,i,o,u,x 或 X. | char,signed char 或 unsigned char |
h |
d,i,o,u,x 或 X. | short int 或 unsigned short int |
l |
d,i,o,u,x 或 X. | long int 或 unsigned long int |
l |
a,A,e,E,f,F,g 或 G. | double(与 scanf() 兼容;在 C90 中未定义) |
ll |
d,i,o,u,x 或 X. | long long int 或 unsigned long long int |
j |
d,i,o,u,x 或 X. | intmax_t 或 uintmax_t |
z |
d,i,o,u,x 或 X. | size_t 或相应的签名类型(POSIX 中的 ssize_t) |
t |
d,i,o,u,x 或 X. | ptrdiff_t 或相应的无符号整数类型 |
L |
a,A,e,E,f,F,g 或 G. | long double |
如果长度修饰符出现时带有除上述指定之外的任何转换说明符,则行为未定义。
Microsoft 指定了一些不同的长度修饰符,并且明确不支持 hh,j,z 或 t。
| 修改符 | 修改 | 适用于 |
|---|---|---|
I32 |
d,i,o,x 或 X. | __int32 |
I32 |
o,u,x 或 X. | unsigned __int32 |
I64 |
d,i,o,x 或 X. | __int64 |
I64 |
o,u,x 或 X. | unsigned __int64 |
I |
d,i,o,x 或 X. | ptrdiff_t(即 32 位平台上的 __int32,64 位平台上的 __int64) |
I |
o,u,x 或 X. | size_t(即 32 位平台上的 unsigned __int32,64 位平台上的 unsigned __int64) |
l 或 L |
a,A,e,E,f,g 或 G. | long double(在 Visual C++中,虽然 long double 是一个独特的类型,但它与 double 具有相同的内部表示。) |
l 或 w |
c 或 C. | 具有 printf 和 wprintf 功能的广泛特性。 (lc,lC,wc 或 wC 类型说明符与 printf 函数中的 C 和 wprintf 函数中的 c 同义。) |
l 或 w |
s,S 或 Z. | 带有 printf 和 wprintf 功能的宽字符串。 (ls,lS,ws 或 wS 类型说明符与 printf 函数中的 S 和 wprintf 函数中的 s 同义。) |
请注意,C,S 和 Z 转换说明符以及 I,I32,I64 和 w 长度修饰符是 Microsoft 扩展。将 l 作为 long double 而不是 double 的修饰符进行处理与标准不同,尽管除非 long double 与 double 具有不同的表示,否则你将难以发现差异。