如何在C语言中使用printf输出"unsigned long"?

451

我永远无法理解如何在C语言中打印unsigned long数据类型。

假设unsigned_foo是一个unsigned long,然后我尝试:

  • printf("%lu\n", unsigned_foo)
  • printf("%du\n", unsigned_foo)
  • printf("%ud\n", unsigned_foo)
  • printf("%ll\n", unsigned_foo)
  • printf("%ld\n", unsigned_foo)
  • printf("%dl\n", unsigned_foo)

但是它们都打印出一些-123123123类型的数字,而不是我所拥有的unsigned long类型。

7个回答

658

%lu 是代表 unsigned long 的正确格式。这里似乎存在其他问题,比如内存破坏或未初始化变量。也许可以提供更多上下文信息?


20
哎呀,这次%lu管用了,谢谢。之前一定发生了什么事情导致它不能用。 - bodacydo
1
如果你遇到了一个 bug,它可能会出现在半随机的情况下... 确保在尝试打印变量之前,它具有有效的值。 - Thanatos
1
即使变量未初始化,printf也不应该到达可以打印减号的点,当格式说明符为%lu时。从技术上讲,这是未定义的行为,但实际上变量具有无法预测的值,这些值被传递给printf,然后由printf解释为无符号值。我猜bodacydo最初的问题是流程到达了一个不正确的printf调用,而不是预期的那个... - R.. GitHub STOP HELPING ICE
非常有帮助,Thanatos。我尝试了%ul但不起作用。ul和lu有什么不同? - Aquarius_Girl
11
@Anisha Kaul: %lu 是一个有效的转换说明符,而 %ul 则不是。%lu 可以拆分为:% 表示开始一个“转换说明符”;l 是长度修饰符,表示 "[unsigned] long int";u 是转换说明符,用于将 unsigned int 以十进制形式打印出来。由于我们使用了长度修饰符 l,它接受一个 unsigned long int。这些字母的顺序必须是这样的:百分号、长度、转换。您可以添加一些其他选项,如宽度和精度,但字母的顺序必须按照上述要求。建议查看相关文档,因为它详细记录了所有内容! - Thanatos
1
%ul 仅会打印无符号整数(使用 %u),然后直接输出字母 "l",就像 "%uw" 会打印无符号整数,紧随其后的是字母 "w"。百分号(%)开始 convspec,u(或其他字符,如 d、s、c 等)结束它。 - Veky

56

对于int类型,使用%d

对于long int类型,使用%ld

对于long long int类型,使用%lld

对于unsigned long long int类型,使用%llu


41
  • %lu 表示 无符号长整型
  • %llu 表示 无符号长长整型

23
Yoda约定: "unsigned long"意为"(l)ong (u)nsigned"。 - Reb.Cabin

26
在您尝试的所有组合中,只有%ld%lu是有效的printf格式说明符。对于类型为unsigned long的变量,%lu(长无符号十进制)、%lx%lX(长十六进制,小写或大写字母),以及%lo(长八进制)是唯一有效的格式说明符(当然,您可以在%l之间添加字段宽度、精度等修饰符)。

2
%ld 可以正常工作,直到 std::numeric_limits<unsigned long>::max()/2 的值。在此之上,%ld 将打印错误的值(负值)。 - Kaushik Acharya
2
@KaushikAcharya:不,上面那个是UB(未定义的行为)。甚至在那之前也可以说是UB,因为printf被指定要求精确正确的参数类型,而没有像va_arg一样的允许余地。 - R.. GitHub STOP HELPING ICE

14

无符号长整型的正确说明符是%lu

如果您未获得预期的确切值,则可能存在代码问题。

请将您的代码复制到此处。然后也许有人可以更好地告诉您问题所在。


13

格式为%lu

请在这里查看有关其他各种数据类型及其在printf中的用法。


2
该文档记录了各种非标准行为,但没有将其标记为非标准。POSIX是访问最方便的printf在线标准;超出ISO C的扩展标记为"CX"标签:http://www.opengroup.org/onlinepubs/9699919799/functions/fprintf.html - R.. GitHub STOP HELPING ICE

11
int main()
{
    unsigned long long d;
    scanf("%llu",&d);
    printf("%llu",d);
    getch();
}

这将会很有帮助……


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接