如何在 C 中打印“unsigned long”?

Posted

技术标签:

【中文标题】如何在 C 中打印“unsigned long”?【英文标题】:How to printf "unsigned long" in C? 【发布时间】:2011-03-13 16:49:04 【问题描述】:

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

假设unsigned_foounsigned 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

【问题讨论】:

【参考方案1】:

%luunsigned long 的正确格式。听起来这里还有其他问题,例如内存损坏或未初始化的变量。也许给我们看一张更大的图?

【讨论】:

糟糕,%lu 这次成功了。谢谢。之前肯定发生过其他事情,但没有奏效。 @bodacydo:如果您有错误,它可能会以半随机的方式出现...在尝试打印之前确保您的变量具有有效值。 即使变量未初始化,当格式说明符为%lu 时,printf 也不应该达到可以打印减号的程度。从技术上讲,这是未定义的行为,但实际上该变量具有不可预测的值,该值被传递给 printf,然后 printf 将其解释为无符号。我猜 bodacydo 最初的问题是流程到达了不正确的 printf 调用,而不是预期的调用...... @Anisha Kaul:%lu 是有效的转换规范,%ul 不是。 %lu,分解为:% — 启动“转换规范”; l — 长度修饰符,l 表示“[unsigned] long int”; u — 转换说明符 u 用于将 unsigned int 打印为十进制。因为我们给了长度修饰符l,所以它接受unsigned long int。字母必须按以下顺序排列:百分比、长度、转换。 (您可以添加更多选项,例如宽度和精度。参见手册页,因为它精确地记录了所有这些内容!) %ul 将只打印无符号(带 %u),然后逐字打印字母“l”。正如“%uw”将打印无符号,后跟字母“w”。 % 开始 convspec,u(或其他字符,如 d、s、c...)结束它。【参考方案2】:

对于 int %d

对于long int %ld

对于 long long int %lld

对于 unsigned long long int %llu

【讨论】:

【参考方案3】: %lu 代表 unsigned long %llu 代表 unsigned long long

【讨论】:

尤达约定:"unsigned long" "(l)ong (u)nsigned" 是。【参考方案4】:

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

【讨论】:

%ld 可以正常工作,直到 std::numeric_limits::max()/2 的值。高于 %ld 将打印错误值(负值)。 @KaushikAcharya:不,上面是 UB。在此之前甚至可以说是 UB,因为 printf 被指定为需要完全正确的参数类型,而没有 va_arg 所拥有的余量。【参考方案5】:
int main()

    unsigned long long d;
    scanf("%llu",&d);
    printf("%llu",d);
    getch();

这会很有帮助。 . .

【讨论】:

【参考方案6】:

格式为%lu

请检查 printf here 中的各种其他数据类型及其用法

【讨论】:

那里记录了各种非标准行为,但没有将其标记为非标准。 POSIX 是最容易访问的 printf 在线标准;超出 ISO C 的扩展都标有“CX”标签:opengroup.org/onlinepubs/9699919799/functions/fprintf.html【参考方案7】:

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

如果您没有得到您期望的确切值,那么您的代码中可能存在一些问题。

请在此处复制您的代码。那么也许有人可以更好地告诉你问题所在。

【讨论】:

以上是关于如何在 C 中打印“unsigned long”?的主要内容,如果未能解决你的问题,请参考以下文章

如何打印大于“unsigned long long”的“std::bitset”的十进制值?

(lldb) 以十六进制打印 unsigned long long

在 C 中给出 unsigned long long 变量值的警告

c语言里的无符号unsigned long ulZ = unsigned long dJDM,在java里怎么办?用long型没有c那么大的数值。

C++ unsigned long 在 4294967295 之后不会回绕

在 c语言中int long unsigned 和 char这四种类型数据的转换规律是_____.