【问题标题】:How to print 64-bit integer in GCC 4.4.1?如何在 GCC 4.4.1 中打印 64 位整数?
【发布时间】:2012-04-30 15:53:13
【问题描述】:

我在 GCC 4.4.1 中使用 Code::Blocks,但我似乎无法从我的 C 代码中打印 64 位有符号整数。

这段代码:

long long longint;

longint = 0x1BCDEFABCDEFCDEF; /* 2003520930423229935 */
printf("Sizeof: %d-bit\n", sizeof(longint) * 8);     /* Correct */
printf("%llx\n", longint);                           /* Incorrect */
printf("%x%x\n", *(((int*)(&longint))+1), longint);  /* Correct */
printf("%lld\n", longint);                           /* Incorrect */ 

产生输出:

Sizeof: 64-bit
cdefcdef
1bcdefabcdefcdef
-839922193

64 位算术似乎可以正常工作:

longint -= 0x1000000000000000;
printf("%x%x\n", *(((int*)(&longint))+1), longint);

给予:

bcdefabcdefcdef

我错过了什么吗?

【问题讨论】:

  • this question 的可能重复项。
  • 第二个printf怎么不对?啊,我现在在例子中看到了。没关系。该示例在 Linux 上为我打印出正确的值。
  • @npclaudiu - 谢谢。我从那里得到的!
  • %lld%llx 是打印 long long 类型值的正确格式指令(在 C99 中)。如果它不起作用,则说明安装中有问题,例如库不匹配或损坏。
  • 对于仍在考虑使用 GCC 4.4.1 的任何人 - 该编译器现在已经有 10 多年的历史了,在提出问题时已经 2.5 年了 :)

标签: c gcc codeblocks


【解决方案1】:

看看%I64d 是否对你有帮助。 %lld 适合 long long int,但有时在 Windows IDE 上情况会变得非常不同

【讨论】:

    【解决方案2】:

    要(在 C99 及更高版本中)可移植地打印 64 位整数,您应该 #include <inttypes.h> 并使用 C99 宏 PRIx64PRId64。这将使您的代码;

    printf("Sizeof: %d-bit\n", sizeof(longint) * 8);
    printf("%" PRIx64 "\n", longint);
    printf("%" PRId64 "\n", longint);
    

    编辑:有关更多示例,请参阅this question

    【讨论】:

    • 这些是int64_t 的技术格式,以防与long long 不同。当然,它们实际上有可能工作在现有的损坏/还不是 C99-still-yet 系统上。 :-)
    【解决方案3】:

    这取决于操作系统。如果您在几乎所有使用 GLIBC 的 GCC 上执行此操作,那么 %llx 可以工作。

    但是,如果您使用的是 mingw 编译器,那么这将使用 Microsoft 库,您需要查看他们的 documentation

    这会将您的程序更改为:

    longint = 0x1BCDEFABCDEFCDEFLL; /* 2003520930423229935 */
    printf("Sizeof: %d-bit\n", sizeof(longint) * 8);     /* Correct */
    printf("%I64x\n", longint);                           /* Incorrect */
    printf("%x%x\n", *(((int*)(&longint))+1), longint);  /* Correct */
    printf("%I64d\n", longint);
    

    【讨论】:

      【解决方案4】:

      longint = 0x1BCDEFABCDEFCDEF; /* 2003520930423229935 */ 你可以打印为-

      printf("%llx", longint);

      【讨论】:

        【解决方案5】:

        终于明白了:

        longint = 0x1BCDEFABCDEFCDEF; /* 2003520930423229935 */
        printf("%I64d\n", longint);
        printf("%I64x\n", longint);
        

        打印:

        2003520930423229935
        1bcdefabcdefcdef
        

        谢谢@npclaudiu!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-09
          • 2013-05-30
          相关资源
          最近更新 更多