2011-06-09 8 views
26

Quiero recomendar el uso de <inttypes.h> a alguien que hace printf con versiones mixtas de 32/64 bit. Intenté buscar en Google una página de introducción o tutorial con algunos ejemplos y pautas de uso, pero no pude encontrar ninguna.Buena introducción a <inttypes.h>

¿Alguien puede recomendar una introducción o un tutorial para <inttypes.h>?

+0

¿Qué es exactamente lo que quiere decir con "mixto 32/64 bits construye". ¿Se esperará que el usuario use los tipos de 'tamaño fijo' de 'stdint.h'? ¿Hay algo en particular que falta en la respuesta de Edwin que llevó a la generosidad que se agrega? –

+1

@Michael: Sí, el problema surge cuando utiliza tipos enteros de ancho conocido como 'int64_t' bajo LP64 donde eso corresponde a' long'. El especificador de formato adecuado es '% ld' en ese caso, pero si construye en un sistema de 32 bits donde corresponde a' long long', entonces necesita '% lld'. Esperaba una descripción que motivara el uso de '' (como hago brevemente en este comentario) y proporcioné ejemplos. Algo que podría señalar para evitar tener que explicar el por qué y el cómo. –

Respuesta

40

Pruebe http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/inttypes.h.html para empezar.

Se encontró un mejor ejemplo de cómo usar las nuevas macros de formato portátil en avr-libc. He incluido un ejemplo (del enlace) para ilustrar. QNX libraries también tienen una mejor descripción legible para el ser humano (si no le gusta leer la especificación en frío), aunque tiene que desplazarse casi hasta el final de la página para llegar al meollo de las descripciones.

#include <inttypes.h> 

uint8_t smallval; 
int32_t longval; 
... 
printf("The hexadecimal value of smallval is %" PRIx8 
     ", the decimal value of longval is %" PRId32 ".\n", 
     smallval, longval); 

Tenga en cuenta que este utiliza el operador de concatenación implícita "Cadena" "Cadena" para producir la cadena (en este ejemplo)

"The hexadecimal value of smallval is %x, the decimal value of longval is %ld.\n" 

Un intento de descomponer la convención de nombres parece indicar:

  • (primeras tres letras)
    • PRI para el formato de printf
    • SCN para el formato scanf
  • (cuarta carta)
    • x para el formato hexadecimal
    • U para el formato sin signo
    • o para el formato octal
    • i para el número entero de formatear
    • d para formato decimal
  • (letras adicionales)
    • 8 de ocho bits
    • 16 durante dieciséis bits
    • 32 de treinta y dos bits
    • 64 de sesenta y cuatro bits
    • FAST8 para "rápido" ocho
    • poco
    • FAST16 para la "rápida" de dieciséis bits
    • FAST32 para la "rápida" treinta y dos bits
    • rÁPIDO 64 para la "rápida" sesenta y cuatro bits
    • LEAST8 de "menos" de ocho bits
    • LEAST16 para el bit
    • LEAST32 "menos" dieciséis de "menos" treinta y dos bits
    • LEAST64 de "menos" de sesenta -cuatro poco
    • puntero PTR para
    • MAX máxima admitida tamaño de bits

por lo PRIx8 significa instrucción de formato printf para formatear a ocho bits hexadecimales.

+0

@Ben, gracias por la edición, ¡lo haces lucir genial! –

+0

Ah, qué buen uso de poner literales de cadena uno al lado del otro. –

+2

PTR es para _integers_ (tamaño_t, intptr_t, ptrdiff_t) de tamaño puntero, no punteros. En al menos una de mis plataformas (OSX), me sale un error al usar PRIxPTR con void *. Use% p para los punteros. –

7

Siempre voy al estándar (PDF link) para esas cosas; no son demasiado complicados una vez que descubres los patrones en los que están configurados. La sección correspondiente es §7.8 Formato de conversión de tipos enteros <inttypes.h>.

1

Siempre empiezo en Wikipedia para buscar un encabezado. <inttypes.h> parece ser muy problemático en Wikipedia. El siguiente paso que tomaré es ir al this site. Este sitio anterior enumera cada macro y da un ejemplo. También puede consultar this site, que en realidad le muestra el archivo de encabezado.No creo que ninguno de esos sean realmente tutoriales, pero son un buen punto de partida.

+0

Los 2 últimos enlaces son los mismos (principalmente solo la lista de macros) –

2

HP tiene una buena referencia en la escritura de código portable y dan algunos consejos específicos para el uso de inttypes.h

Writing Portable Code

Cuestiones relacionadas