C 整数转换
本节描述了各种格式说明符,用于以不同方式打印整数。
‘%d’和’%i’转换说明符分别打印有符号十进制数;而’%b’、‘%o’、‘%u’和’%x’打印无符号二进制、八进制、十进制或十六进制数(分别)。‘%X’转换说明符与’%x’相同,但使用字符’ABCDEF’作为数字,而不是’abcdef’。‘%B’转换说明符与’%b’相同,但带有’#’标志时,输出以’0B’而不是’0b’开头。
以下是一些有效的标志:
- ‘-’:将结果左对齐(默认为右对齐)。
- ‘+’:对于有符号的’%d’和’%i’转换,如果值为正,则打印加号。
- ’ ‘:对于有符号的’%d’和’%i’转换,如果结果不以加号或减号开头,则在左侧添加空格。由于’+’标志确保了结果包含加号,因此此标志无效,如果同时提供两者。
- ‘#’:对于’%o’转换,强制前导数字为’0’,就像通过增加精度一样。对于’%x’或’%X’,此前缀为’0x’或’0X’(分别)。对于’%b’或’%B’,此前缀为’0b’或’0B’(分别)。这在’%d’、‘%i’或’%u’转换中没有用。使用此标志会导致输出可以被strtoul函数解析(参见整数解析)以及scanf与’%i’转换(参见数值输入转换)。
- ‘m’:打印错误常量或十进制错误数字,而不是可能翻译的错误消息。
- ‘'’:根据LC_NUMERIC类别指定的区域设置将数字分组。这是GNU扩展。
- ‘0’:用零填充字段,而不是空格。零出现在任何指示符号或基数之后。如果指定了精度,则忽略此标志。如果指定了精度,则指定要出现的最小数字数;必要时生成前导零。如果没有指定精度,则打印所需数量的数字。如果将值显式设置为零且精度为零,则不产生任何字符。
如果没有类型修饰符,相应的参数被视为int(对于有符号的’%i’和’%d’转换)或unsigned int(对于无符号的’%b’、‘%B’、‘%o’、‘%u’、‘%x’和’%X’转换)。请注意,由于printf和friends是可变参数的,因此任何char和short参数都会自动转换为int。对于其他整数类型的参数,可以使用以下修饰符:
‘hh’:指定参数为有符号char或无符号char,如适用。char参数无论如何都会通过默认参数提升转换为int或unsigned int,但’hh’修饰符表示将其再次转换回char。
此修饰符是在ISO C99中引入的。
‘h’:指定参数为有符号short或无符号short,如适用。短参数无论如何都会通过默认参数提升转换为int或unsigned int,但’h’修饰符表示将其再次转换回short。
此修饰符是在ISO C99中引入的。
‘j’:指定参数为intmax_t或uintmax_t,如适用。
此修饰符是在ISO C99中引入的。
‘l’:指定参数为long int或unsigned long int,如适用。两个’l’字符类似于’L’修饰符,如下所述。
如果与’%c’或’%s’一起使用,相应的参数将被视为宽字符或宽字符字符串。这种使用’l’的方式是在Amendment 1中ISO C90引入的。
‘L’:‘ll’:‘q’:指定参数为long long int。(此类型由GNU C编译器支持。在不支持额外长整数的系统上,这与long int相同。)
’q’修饰符是另一个名称,来自4.4 BSD;有时称为“quad”int。
‘t’:指定参数为ptrdiff_t。
此修饰符是在ISO C99中引入的。
‘wn’:指定参数为intn_t或int_leastn_t(两者相同),用于有符号整数转换,或uintn_t或uint_leastn_t(两者相同),用于无符号整数转换。如果类型比int窄,则提升的参数将转换回指定的类型。
此修饰符是在ISO C2X中引入的。
‘wfn’:指定参数为int_fastn_t或uint_fastn_t,如适用。如果类型比int窄,则提升的参数将转换回指定的类型。
此修饰符是在ISO C2X中引入的。
‘z’:‘Z’:指定参数为size_t。
’z’是在ISO C99中引入的。’Z’是GNU扩展,早于此添加,不应在新代码中使用。