How to printf “unsigned long” in C?
我永远无法理解如何在C中打印unsigned long数据类型。
假设unsigned_foo是unsigned long,那么我尝试:
-
printf("%lu
", unsigned_foo)
-
printf("%du
", unsigned_foo)
-
printf("%ud
", unsigned_foo)
-
<5233>
-
printf("%ld
", unsigned_foo)
-
printf("%dl
", unsigned_foo)
并且所有这些都打印了某种-123123123而不是我拥有的unsigned long。
%lu是unsigned long的正确格式。听起来这里还有其他问题,例如内存损坏或未初始化的变量。或许可以向我们展示更大的图景
-
哎呀,%lu这次工作了。谢谢。之前必须发生的其他事情并没有奏效。
-
@bodacydo:如果你有一个bug,它可能会出现半随机...在你尝试打印它之前,请确保你的变量有一个有效值。
-
即使变量未初始化,当格式说明符%lu时,printf也不应该达到可以打印减号的点。从技术上讲,它是未定义的行为,但实际上变量有一个不可预测的值传递给printf,然后printf解释为unsigned。我猜bodacydo的原始问题是流程到达不正确的printf调用而不是预期的...
-
非常有帮助,Thanatos。我试过%ul没用。与lu有什么不同?
-
@Anisha Kaul:%lu是有效的转换规范,%ul不是。 %lu,分解为:% - 启动"转换规范"; l - 长度修饰符,l表示"[unsigned] long int"; u - 转换说明符,u用于将unsigned int打印为十进制。因为我们给了长度修饰符l,所以它接受unsigned long int。字母必须按顺序排列:百分比,长度,转换。 (还有一些选项,例如宽度和精度,您可以添加。请参阅手册页,因为它准确记录了所有这些!)
-
%ul将只打印unsigned(带%u),然后字母"l"逐字打印。正如"%uw"将打印未签名,然后是字母"w"。 %启动convspec,你(或其他一些字符,如d,s,c ......)结束它。
-
Yoda惯例:"unsigned long""(l)ong(u)nsigned"是。
在您尝试的所有组合中,%ld和%lu是唯一有效的printf格式说明符。 %lu(长无符号十进制),%lx或%lx(带有小写或大写字母的长十六进制)和%lo(长八进制)是unsigned long类型变量的唯一有效格式说明符(当然您可以在%和l之间添加字段宽度,精度等修饰符。
-
%ld将正常工作,直到std :: numeric_limits :: max()/ 2的值。高于该%ld将打印错误的值(负值)。
-
@KaushikAcharya:不,超过它是UB。在此之前它甚至可以说是UB,因为printf被指定为需要完全正确的参数类型而没有va_arg所允许的余量。
对于int %d
对于long int %ld
对于long long int %lld
对于unsigned long long int %llu
1 2 3 4 5 6 7
| int main ()
{
unsigned long long d ;
scanf("%llu",&d );
printf("%llu",d );
getch();
} |
这会很有帮助。 。 。
格式为%lu。
请在此处查看printf中的各种其他数据类型及其用法
-
在那里记录了各种非标准行为,而没有将其标记为非标准行为。 POSIX是printf最易于访问的在线标准; ISO C以外的扩展名标有"CX"标记:opengroup.org/onlinepubs/9699919799/functions/fprintf.html
unsigned long的正确说明符是%lu。
如果您没有得到预期的确切值,那么您的代码可能会出现一些问题。
请在此处复制您的代码。那么也许有人可以更好地告诉你问题是什么。
我有同样的问题。试试"%ul",它对我有用。
-
这个问题在8年多前得到了广泛的回答。请确保新答案增加新信息,更重要甚至是正确的。