为什么“+”号不能与 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
格式输出时
我刚刚写了 运行 下面的程序。这只是给出了一个意想不到的输出,没有 +
符号打印到 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