2012-04-19 25 views
12

Estoy usando Code::Blocks con GCC 4.4.1 y parece que no puedo imprimir enteros de 64 bits enteros desde mi código-C.Cómo imprimir un entero de 64 bits en GCC 4.4.1?

este código:

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 */ 

Produce una salida:

Sizeof: 64-bit 
cdefcdef 
1bcdefabcdefcdef 
-839922193 

aritmética de 64 bits parece funcionar correctamente:

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

Da:

bcdefabcdefcdef 

¿Me falta algo?

+1

duplicado posible de [esta cuestión] (http://stackoverflow.com/questions/2844/how-do-you-printf-an-unsigned-long- long-int). – npclaudiu

+0

¿Cómo es la segunda impresión incorrecta? Ah, ya veo en el ejemplo ahora. No importa. El ejemplo imprime el valor correcto para mí en Linux. –

+0

@npclaudiu - Gracias. ¡Lo obtuve de allí! – Fenikso

Respuesta

6

Ver si %I64d te ayuda. %lld está muy bien para long long int pero las cosas se ponen realmente diferente a veces en Windows IDE

9

A (en C99 y más) con portabilidad de impresión de 64 bits enteros, usted debe #include <inttypes.h> y utilizar las macros C99 PRIx64 y PRId64. Eso haría tu código;

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

Editar: Véase this question para ver más ejemplos.

+2

Esos son formatos técnicamente para 'int64_t', en caso de que difiera de' long long'. Por supuesto, hay alguna posibilidad de que realmente * funcionen * en sistemas existentes rotos/no del todo C99-todavía-todavía. :-) – torek

+0

También funciona. ¡Gracias! – Fenikso

0

último tiene:

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

Lienzo:

2003520930423229935 
1bcdefabcdefcdef 

Gracias @npclaudiu!

4

Esto depende del sistema operativo. Si está haciendo esto en casi cualquier GCC que use GLIBC, entonces% llx funciona.

Sin embargo, si está utilizando el compilador mingw, entonces esto usa las bibliotecas de Microsoft, y necesita buscar en su documentation.

Esto cambia su programa a:

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); 
+1

+1 para señalar mingw docs para Windows. – Fenikso

Cuestiones relacionadas