representación hexagonal larga sin firmar

#include  #include  int main(void) { char buf[256] = {}; unsigned long i=13835058055298940928; snprintf(buf, 1024, "%lx", i); /* Line 7 */ printf("%s\n",buf); return 0; } 

En la línea 7, si uso %lux , snprintf no hace ninguna conversión y solo imprime 0x13835058055298940928x , mientras que si uso solo %lx , imprime una conversión hexadecimal esperada.

¿Cómo represento sin signo largo en hexadecimal?

Un formato de "%lux" se trata como "%lu" (sin signo, decimal) seguido de una letra x .

El formato "%x" requiere un argumento de tipo sin signo; no hay ningún mecanismo (directo) para imprimir enteros con signo en formato hexadecimal.

El formato para imprimir un valor unsigned long en hexadecimal es "%lx" . ( x es hexadecimal, d es decimal firmado, u es decimal sin signo; cualquiera de ellos puede ser calificado con l por mucho tiempo).

Tenga en cuenta que el valor 13835058055298940928 requiere al menos un tipo sin signo de 64 bits para almacenarlo sin desbordamiento. El tipo unsigned long es de al menos 32 bits; es de 64 bits en algunos sistemas, pero de ninguna manera todos. Si desea que su código sea portátil, debe usar el tipo unsigned long long lugar del unsigned long . El formato para imprimir un valor unsigned long long en hexadecimal es "%llx" .

Para mayor claridad, por lo general precedo la salida hexadecimal con 0x , por lo que es obvio para el lector que es un número hexadecimal:

 printf("0x%llx\n", some_unsigned_long_long_value); 

(Puede obtener el mismo resultado con %#llx , pero me resulta más fácil escribir 0x que recordar el significado de la bandera # ).