3

我刚刚编写并运行了以下程序。这只是给出了一个意外的输出,没有+打印到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?我怎样才能做到这一点?

4

3 回答 3

3

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

+有符号转换的结果总是以加号或减号开头。(如果未指定此标志,则仅在转换负值时才以符号开头。)

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

于 2021-09-24T11:35:44.613 回答
2

为什么没有为 U..._MAX 打印 + 号?我怎样才能做到这一点?

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

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

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

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

我猜printf不签的原因是因为它是unsigned. 许多格式说明符与平台或库相关,因此您可能会遇到一个库unsigned,当它看到 时,它会为 . 添加加号%+

于 2021-09-24T11:28:19.167 回答
1

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

来自 C 标准(7.21.6.1 fprintf 函数)

  • 符号转换的结果总是以加号或减号开头。(如果未指定此标志,则仅在转换负值时才以符号开头。)

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

如果用unsigned values代替unsigned conversion specifiers一词,您的问题的标题听起来会更正确。+也就是说,给符号加上前缀或-总是输出为非负值的值没有什么意义。当输出有符号值时,使用显式符号输出它们是有意义的,以使输出更具可读性以区分正值和负值,例如当它们在表中输出时

于 2021-09-24T11:48:50.910 回答