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

我错过了什么吗?

4

5 回答 5

11

看看能不能%I64d帮到你。%lld很好,long long int但有时在 Windows IDE 上情况会变得非常不同

于 2012-04-19T06:54:36.353 回答
11

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

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

编辑:有关更多示例,请参阅此问题

于 2012-04-19T06:56:51.163 回答
6

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

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

这会将您的程序更改为:

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);
于 2012-04-19T06:59:22.730 回答
1

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

printf("%llx", longint);

于 2020-03-12T13:49:10.097 回答
0

终于明白了:

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

印刷:

2003520930423229935
1bcdefabcdefcdef

谢谢@npclaudiu!

于 2012-04-19T06:57:24.937 回答