如何打印F";无符号长“;在C中?

如何打印F";无符号长“;在C中?,c,printf,long-integer,unsigned,format-specifiers,C,Printf,Long Integer,Unsigned,Format Specifiers,我永远无法理解如何在C中打印无符号long数据类型 假设unsigned_foo是一个unsigned long,那么我尝试: printf(“%lu\n”,unsigned\u foo) printf(“%du\n”,未签名的\u foo) printf(“%ud\n”,unsigned\u foo) printf(“%ll\n”,unsigned\u foo) printf(“%ld\n”,未签名) printf(“%dl\n”,unsigned\u foo) 它们都打印了某种类型的-1

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

假设
unsigned_foo
是一个
unsigned long
,那么我尝试:

  • printf(“%lu\n”,unsigned\u foo)
  • printf(“%du\n”,未签名的\u foo)
  • printf(“%ud\n”,unsigned\u foo)
  • printf(“%ll\n”,unsigned\u foo)
  • printf(“%ld\n”,未签名)
  • printf(“%dl\n”,unsigned\u foo)

它们都打印了某种类型的
-123123123
数字,而不是我的
无符号长

%lu
无符号长
的正确格式。听起来这里还有其他问题,比如内存损坏或未初始化变量。也许能给我们展示一幅更大的图片?

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

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


请在这里复制您的代码。然后,也许有人能更好地告诉您问题所在。

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

格式为
%lu

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

这将有助于

  • %lu
    用于无符号长
  • %llu
    用于无符号长

    • 对于int
      %d

      对于长整型
      %ld

      对于长整型
      %lld


      对于无符号long long int
      %llu

      Oops,
      %lu
      这次起作用。谢谢以前肯定发生过其他事情,但它不起作用。@bodacydo:如果你有一个bug,它可能会半随机出现。。。在尝试打印变量之前,请确保该变量具有有效值。即使该变量未初始化,当格式说明符为
      %lu
      时,printf也不可能达到可以打印减号的程度。从技术上讲,这是未定义的行为,但实际上变量有一个不可预测的值,该值被传递给printf,然后printf将其解释为无符号。我猜bodacydo最初的问题是流到达一个错误的printf调用,而不是预期的…@Anisha Kaul:%lu是一个有效的转换规范,%ul不是<代码>%lu,分解为:
      %
      -启动“转换规范”
      l
      -长度修饰符,
      l
      表示“[无符号]长整数”
      u
      -转换说明符
      u
      用于将
      无符号int
      打印为十进制。因为我们给了长度修饰符
      l
      ,所以它会接受一个
      无符号长int
      。字母的顺序必须是:百分比、长度、换算。(您还可以添加一些选项,例如宽度和精度。请参阅手册页,因为它精确地记录了所有这些!)%ul将只打印未签名(带有%u),然后逐字打印字母“l”。正如“%uw”将打印未签名,后跟字母“w”。%启动convspec,u(或其他字符,如d、s、c…)结束它。各种非标准行为都记录在那里,但没有将其标记为非标准。POSIX是printf最容易访问的在线标准;ISO C以外的扩展用“CX”标记:%ld将正常工作,直到std::numeric_limits::max()的值。高于该值%ld将打印错误的值(负值)。@Kaushikarya:不,高于该值是UB。在这之前,它甚至可以说是UB,因为
      printf
      被指定为需要完全正确的参数类型,而不需要
      va_arg
      应有的容差。Yoda约定:“unsigned long”“(l)ong(u)nsigned”是。
      int main()
      {
          unsigned long long d;
          scanf("%llu",&d);
          printf("%llu",d);
          getch();
      }