2012-08-25 37 views
33

Estoy intentando imprimir el valor de uint16_t y uint32_t pero no está dando el o/p deseado.Cómo imprimir el valor de las variables uint32_t y 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; 
} 

También utilicé

printf("%"PRIu32, a); 

que está mostrando un error.

cómo imprimir estos valores y lo que será el O/P deseada

+3

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

Respuesta

53

Es necesario incluir inttypes.h si desea que todos esos nuevos especificadores de formato ingeniosas para los intN_t tipos y sus hermanos, y que es la forma correcta (es decir, portátil) de hacerlo, siempre que su compilador cumpla con C99. No debe usar las estándar como %d o %u en caso de que los tamaños sean diferentes de lo que usted piensa.

Incluye stdint.h y la amplía con algunas otras cosas, como las macros que se pueden usar para la familia de llamadas printf/scanf. Esto se trata en la sección 7.8 del estándar ISO C99.

Por ejemplo, el siguiente programa:

#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; 
} 

salidas:

1234 
5678 
12

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.

+1

Aquí hay un caso de borde muy pequeño, si firmó int no es complemento de dos. En ese caso, no contendrá correctamente el valor de complemento de los dos más negativos. MUY de poca importancia, lo admitiré, pero algo a tener en cuenta si quieres la máxima portabilidad. – paxdiablo

+1

@paxdiablo: Se requiere que los tipos 'intN_t' sean complemento de dos sin bits de relleno. Si 'int' no es complemento de dos, entonces los tipos' intN_t' probablemente no se definirán * a menos que * la implementación también soporte dos tipos distintos de complemento. Buen punto, pero creo que es un caso aún más leve de lo que sugiere. –

+1

Sin dudas. Sospecho que tendrías dificultades para encontrar una máquina en el planeta que tuviera los nuevos tipos integrales pero que aún tuviese el complemento o el tipo de signo/magnitud 'int' :-) – paxdiablo

-2

En mi caso, solo uso %u para generar el valor con el tipo uint32_t. Funciona.

p. Ej.

uint32_t i = 31 - __builtin_clz(mask); 

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

Esto provocará un comportamiento indefinido en los sistemas donde' sizeof (unsigned int)! = sizeof (uint32_t) '. – user694733

+0

Gracias hermano. Y también encontré que podemos usar '% 08x' para presentarlo. Se mostrará como binario. –

+1

Usar '% 08x' tiene el mismo problema que'% u'. Además, mostrará el valor como número hexadecimal; no hay un especificador binario en el estándar C printf. – user694733

Cuestiones relacionadas