【问题标题】:What format specifier to use for printing "unsigned long long" in C with getting truncated values on the console?使用什么格式说明符在 C 中打印“unsigned long long”并在控制台上获取截断值?
【发布时间】:2011-02-12 19:59:44
【问题描述】:

typedef unsigned long long IMSI;

IMSI imsi;

当我尝试使用 %llu 作为格式说明符来打印它时,我得到了一个相当不相关的值。

我可以做些什么来消除这个问题?

我也在使用 gcc 4.3.3 虽然我一直在使用的跟踪机制可能存在问题,但即使使用 printf 我也会遇到同样的问题。

    imsiAsInt = 9379666465 ;
    brrm_trace(ubm_TRACE_BRRM_UECTRL,ubm_TRACE_INFO,
              UEC_IUH_ACCACHE_ENTRY_FOUND,imsiAsInt, status.ueRegCause,
              mCacheEntries.size());
    printf("printf:UEC_IUH_ACCACHE_ENTRY_FOUND=%llu, sizeof(IMSI)=%d\n",
            imsiAsInt,sizeof(IMSI));

这给出了以下输出 UEC_IUH_ACCACHE_ENTRY_FOUND Imsi=789731873,UeRegCause=1,CurSize=5 -->跟踪 printf:UEC_IUH_ACCACHE_ENTRY_FOUND=789731873, sizeof(IMSI)=8 ---> 使用 printf 时

此外,对于 7 位数的较小值,我没有遇到任何问题。

【问题讨论】:

  • 你用非负数初始化了吗?
  • 你能在一个最小的程序上复制这个并粘贴吗?

标签: c++ c


【解决方案1】:

您使用的是哪个编译器?下面的程序

#include <stdio.h>
int main()
{
  unsigned long long x;

  x = 12345;
  printf("Value: %llu\n", x);

  x = -1;
  printf("Value: %llu\n", x);

  return 0;
}

确实给出了预期的输出:

Value: 12345
Value: 18446744073709551615

在带有 gcc 4.4.3 的 Linux 上

【讨论】:

  • 对于上面粘贴的程序,我也得到了相同的输出。实际上我没有直接使用 printf 。我们有自己的跟踪机制,这很可能是一个问题。我会检查问题所在,然后看看该怎么做。非常感谢你们这么快的反应。
【解决方案2】:

这可能是个问题:

imsiAsInt = 9379666465 ;

[Warning] integer constant is too large for 'long' type 

试试9379666465ll

【讨论】:

  • +1 假设它是 32 位整数,这绝对是一个问题。它应该是 ULL,因为类型是无符号的。
【解决方案3】:

您没有说明您使用的是什么操作系统或编译器,也没有发布代码,因此很难给出正确答案。不过我会尝试一下,并猜测您使用的是旧版本的 MSVC,它不支持 long long 的标准 printf 格式说明符,因此您可能不得不使用非标准的 Microsoft 替代品 @ 987654322@得到想要的结果。

为了将来参考,您应该发布您的代码,并提供足够的细节供人们回答,例如您正在使用什么操作系统和编译器。正如其他人所指出的,您还应该对接受率做一些事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 2012-08-22
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多