Le macro definita <inttypes.h>
sono il modo più corretto per stampare i valori di tipi uint32_t
, uint16_t
, e così via - - ma non sono l'unico modo.
Personalmente, trovo quelle macro difficili da ricordare e scomode da usare. (Data la sintassi di una stringa di formato printf
, probabilmente non è evitabile, non sto affermando che avrei potuto trovare un sistema migliore.)
Un'alternativa è quella di trasmettere i valori a un tipo predefinito e utilizzare il formato per quel tipo
Tipi int
e unsigned int
sono garantiti dal linguaggio di avere almeno 16 bits, e quindi di essere in grado di contenere qualsiasi valore convertito di tipo int16_t
o uint16_t
, rispettivamente. Allo stesso modo, long
e unsigned long
hanno almeno 32 bit di larghezza e long long
e unsigned long long
hanno almeno 64 bit di larghezza.
Ad esempio, potrei scrivere il programma come questo (con un paio di modifiche aggiuntive):
#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;
}
Un vantaggio di questo approccio è che può funzionare anche con le implementazioni pre-C99 che non supportano <inttypes.h>
. Una tale implementazione molto probabilmente non avrebbe nemmeno <stdint.h>
, ma la tecnica è utile per altri tipi di interi.
fonte
2014-09-23 00:17:59
Sarebbe molto più utile mostrarci il messaggio di errore (esatto!) Piuttosto che dire semplicemente che "mostra errore". E piuttosto che "non dare l'o/p desiderato", mostraci l'output effettivo (e scrivi la parola "output" piuttosto che scrivere "o/p"). –