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


342

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

假设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我的数字。

Answers:


499

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


12
糟糕,%lu这次工作了。谢谢。之前一定有其他事情发生了,但没有成功。
bodacydo

1
@bodacydo:如果您有错误,则它可能会以半随机形式出现...在尝试打印变量之前,请确保变量具有有效值。
塔纳托斯

1
即使变量未初始化,当格式说明符为时,printf也不应该达到可以打印负号的位置%lu。从技术上讲,这是未定义的行为,但实际上,变量具有不可预测的值,该值会传递给printf,然后printf会将其解释为未签名。我猜bodacydo最初的问题是流到达了错误的printf调用,而不是预期的...
R .. GitHub停止帮助ICE 2010年

8
@Anisha Kaul:%lu是有效的转换规范,%ul不是。%lu,分解为:%—启动“转换规范”;l—长度修饰符,l表示“ [unsigned] long int”;u—转换说明符,u用于将an unsigned int打印为十进制。因为我们给了length修饰符l,所以它接受了unsigned long int。字母必须按以下顺序排列:百分比,长度,转换。(您可以添加一些其他选项,例如宽度和精度。请参见手册页,因为它精确地记录了所有这些信息!)
Thanatos 2012年

1
%ul只会打印无符号(带有%u),然后逐字打印字母“ l”。就像“%uw”将打印无符号,后跟字母“ w”一样。%开始convspec,u(或其他字符,例如d,s,c ...)结束。
Veky 2013年


28

对于int %d

对于长整型 %ld

对于长的长整型 %lld

对于unsigned long long int %llu


23

出所有的组合,你试过了,%ld并且%lu是唯一的,它们在所有有效的printf格式说明。%lu(长无符号十进制),%lx%lX(长六角用小写或大写字母),和%lo(长八进制)是用于无符号长(当然可以添加字段宽度,精度等类型的变量的唯一有效的指定格式之间改性剂%l)。


1
%ld可以正常工作,直到std :: numeric_limits <unsigned long> :: max()/ 2的值为止。高于该%ld将输出错误的值(负值)。
考希克·阿查里亚

1
@KaushikAcharya:不,上面是UB。而且在此之前甚至可以说是UB,因为它printf被指定为要求确切正确的参数类型而没有允许的余量va_arg
R .. GitHub停止帮助ICE 2014年



8

unsigned long的正确说明符是%lu

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

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


-5

我有同样的问题。尝试“%ul”,它对我有用。


6
八年前,这个问题得到了广泛的回答。请确保新答案会添加新信息,更重要的是正确的。
Gerhardh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.