2012-08-25 22 views
33

Sto provando a stampare uint16_t e uint32_t valore ma non sta dando desiderato o/p.Come stampare il valore delle variabili uint32_t e uint16_t?

#include<stdio.h> 
#include <netinet/in.h> 

int main() 
{ 
    uint32_t a=12,a1; 
    uint16_t b=1,b1; 
    a1=htonl(a); 
    printf("%d---------%d",a1); 
    b1=htons(b); 
    printf("\n%d-----%d",b,b1); 
    return 0; 
} 

Ho anche usato

printf("%"PRIu32, a); 

che segnala errore.

Come stampare questi valori e quale sarà l'O/P desiderato

+3

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"). –

risposta

53

è necessario includere inttypes.h se si desidera che tutti quegli ingegnosi nuovi identificatori di formato per i intN_t tipi e le loro fratelli, e che è la corretto (cioè portatile) per farlo, a patto che il compilatore sia conforme a C99. Non si dovrebbero usare quelli standard come %d o %u nel caso in cui le dimensioni siano diverse da ciò che si pensa.

Include stdint.h e lo estende con alcune altre cose, come i macro che possono essere utilizzati per la famiglia di chiamate printf/scanf. Questo è trattato nella sezione 7.8 della norma ISO C99.

Ad esempio, il seguente programma:

#include <stdio.h> 
#include <inttypes.h> 
int main (void) { 
    uint32_t a=1234; 
    uint16_t b=5678; 
    printf("%" PRIu32 "\n",a); 
    printf("%" PRIu16 "\n",b); 
    return 0; 
} 

uscite:

1234 
5678 
12

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.

+1

C'è un caso limite molto secondario qui, se firmato int non è il complemento a due. In tal caso, non terrà correttamente il valore del complemento a due più negativo. MOLTO minore, ammetto ma qualcosa a cui prestare attenzione se si desidera la massima portabilità. – paxdiablo

+1

@paxdiablo: I tipi 'intN_t' devono essere a complemento a due senza bit di riempimento. Se 'int' non è un complemento a due, allora i tipi' intN_t' probabilmente non saranno definiti * a meno che * l'implementazione supporti anche tipi distinti di complemento a due. Buon punto, ma penso che sia un caso limite ancora più piccolo di quello che suggerisci. –

+1

Nessun dubbio. Sospetto che avresti difficoltà a trovare una macchina sul pianeta che sfoggiava i nuovi tipi integrali ma che aveva ancora un complemento o un tipo di segno/magnitudine 'int' :-) – paxdiablo

-2

Nel mio caso, io uso solo %u per emettere il valore con il tipo uint32_t. Funziona.

ad es.

uint32_t i = 31 - __builtin_clz(mask); 

    D("read i= %u ", __FUNCTION__, i); 
+2

Ciò causerebbe un comportamento indefinito su sistemi in cui' sizeof (unsigned int)! = sizeof (uint32_t) '. – user694733

+0

Grazie fratello. E ho anche scoperto che possiamo usare '% 08x' per presentarlo. Verrà visualizzato come binario. –

+1

L'uso di '% 08x' ha lo stesso problema di'% u'. Inoltre, visualizzerà il valore come numero esadecimale; non esiste uno specificatore binario nella stampa C standard. – user694733

Problemi correlati