为什么“+”号不能与 printf 一起用于无符号值?

Why doesn't the '+' sign work with printf for unsigned values?

我刚刚写了 运行 下面的程序。这只是给出了一个意想不到的输出,没有 + 符号打印到 U...MAX.

#include <limists.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
    // ...
    printf("LLONG_MIN:  %+lli\n", LLONG_MIN);
    printf("LLONG_MAX:  %+lld\n", LLONG_MAX);
    printf("ULLONG_MAX: %+llu\n", ULLONG_MAX);
    return EXIT_SUCCESS;
}

我得到了这个:

CHAR_BIT:   8
SCHAR_MIN:  -128
SCHAR_MAX:  +127
UCHAR_MAX:  255
SHRT_MIN:   -32768
SHRT_MAX:   +32767
USHRT_MAX:  65535
INT_MIN:    -2147483648
INT_MAX:    +2147483647
UINT_MAX:   4294967295
LONG_MIN:   -2147483648
LONG_MAX:   +2147483647
ULONG_MAX:  4294967295
LLONG_MIN:  -9223372036854775808
LLONG_MAX:  +9223372036854775807
ULLONG_MAX: 18446744073709551615

为什么 U..._MAX 没有打印 + 标志? 我该怎么做?

Why there is no + sign printed for U..._MAX? How can I do that?

如果它是无符号的,你可以像这样格式化它,移动格式说明符前面的加号:

printf("...: +%...\n", ...);

如果它已签名,您可以像现在一样格式化它:

printf("...: %+...\n", ...);

我猜 printf 不签名的原因是因为它是 unsigned。许多格式说明符都依赖于平台或库,因此您可能会遇到一个库,当它看到 %+.

时,它会为 unsigned 添加加号

此功能在标准中的记录相当少,我们只能阅读此 (7.21.6.1):

+ The result of a signed conversion always begins with a plus or minus sign. (It begins with a sign only when a negative value is converted if this flag is not specified.)

我的看法是,这应该理解为 + 中必须始终跟有符号数转换说明符,例如 %d%f。您使用了无符号说明符 %u 所以我认为您的代码具有未定义的行为,因为它混合了 +%u.

转换说明符 u 不是带符号的转换说明符,而标志 + 与带符号的转换说明符一起使用。

来自C标准(7.21.6.1 fprintf函数)

  • The result of a signed conversion always begins with a plus or minus sign. (It begins with a sign only when a negative value is converted if this flag is not specified.)

所以你得到了预期的结果。带有无符号转换说明符的标志 + 无效。

如果用 unsigned values 代替 unsigned conversion specifiers,您的问题标题听起来会更正确。也就是说,将符号 +- 加到始终输出为 non-negative 的值前没有什么意义。当输出有符号值时,用明确的符号输出它们是有意义的,以使输出更具可读性以区分正值和负值,例如当它们以 table

格式输出时