las macros definidas en <inttypes.h>
son la forma más correcta para imprimir valores de tipos uint32_t
, uint16_t
, y así sucesivamente - - pero no son la única manera.
Personalmente, encuentro esas macros difíciles de recordar y difíciles de usar. (Dada la sintaxis de una cadena de formato printf
, probablemente sea inevitable; no pretendo haber podido encontrar un sistema mejor).
Una alternativa es convertir los valores a un tipo predefinido y usar el formato para ese tipo.
Tipos int
y unsigned int
están garantizados por el lenguaje para tener al menos 16 bits de ancho, y por lo tanto para ser capaz de mantener cualquier valor convertido de tipo int16_t
o uint16_t
, respectivamente. De manera similar, long
y unsigned long
tienen al menos 32 bits de ancho, y long long
y unsigned long long
tienen al menos 64 bits de ancho.
Por ejemplo, yo podría escribir el programa como este (con algunos retoques adicionales):
#include <stdio.h>
#include <stdint.h>
#include <netinet/in.h>
int main(void)
{
uint32_t a=12, a1;
uint16_t b=1, b1;
a1 = htonl(a);
printf("%lu---------%lu\n", (unsigned long)a, (unsigned long)a1);
b1 = htons(b);
printf("%u-----%u\n", (unsigned)b, (unsigned)b1);
return 0;
}
Una ventaja de este enfoque es que puede trabajar incluso con implementaciones-C99 pre que no son compatibles <inttypes.h>
. Tal implementación probablemente tampoco tendría <stdint.h>
, pero la técnica es útil para otros tipos de enteros.
Sería mucho más útil que nos muestre el mensaje de error (¡exacto!) En lugar de simplemente decir que está "mostrando error". Y en lugar de simplemente "no dar o/p deseado", muéstrenos el resultado real (y deletree la palabra "salida" en lugar de escribir "o/p"). –