Quiero recomendar el uso de <inttypes.h> a alguien haciendo printf con compilaciones mixtas de 32/64 bits. Intenté buscar en Google una página de introducción o tutorial con algunos ejemplos y pautas de uso, pero no pude encontrar ninguna.
¿Alguien puede recomendar una introducción o tutorial para <inttypes.h>?
¿Qué quiere decir exactamente con “compilaciones mixtas de 32/64 bits”? ¿Se esperará que el usuario utilice los tipos de ‘tamaño fijo’ de stdint.h? ¿Hay algo en particular que falta en la respuesta de Edwin que llevó a que se agregara la recompensa?
– Michael Burr
15 de junio de 2011 a las 0:44
@Michael: Sí, el problema surge cuando usa 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 se basa en un sistema de 32 bits donde corresponde a long long entonces necesitas %lld. Esperaba una descripción que motivara el uso de <inttypes.h> (como lo hago brevemente en este comentario), además de proporcionar ejemplos. Algo que pudiera señalar para ahorrarme tener que explicar el por qué y el cómo.
Encontramos 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. Bibliotecas QNX también tiene una mejor descripción legible por humanos (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 esto 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 nomenclatura parece indicar:
(primeras tres letras)
PRI para formato printf
SCN para formato scanf
(cuarta letra)
x para formato hexadecimal
u para formato sin firmar
o para formato octal
i para formato entero
d para formato decimal
(letras adicionales)
8 por ocho bits
16 por dieciséis bits
32 por treinta y dos bits
64 para sesenta y cuatro bits
FAST8 para ocho bits “rápidos”
FAST16 para dieciséis bits “rápidos”
FAST32 para treinta y dos bits “rápidos”
FAST64 para sesenta y cuatro bits “rápidos”
MENOS8 para “menos” ocho bits
MENOS16 para “menos” dieciséis bits
MENOS32 para “menos” treinta y dos bits
MENOS64 para “menos” sesenta y cuatro bits
PTR para puntero
MAX para el tamaño de bit máximo admitido
entonces PRIx8 significa instrucción de formato printf para formatear a ocho bits hexadecimales.
Ah, qué buen uso poner cadenas literales una al lado de la otra.
– Seth Carnegie
9 de mayo de 2012 a las 0:28
PTR es para el tamaño de un puntero enteros (size_t,intptr_t,ptrdiff_t), no punteros. En al menos una de mis plataformas (OSX), aparece un error al usar PRIxPTR con void*. Use %p para punteros.
– Rick Bergé
08/07/2013 a las 19:55
@RickBerge: tenga en cuenta que estrictamente las macros PTR son para intptr_t y uintptr_t; los estándares C99 y C11 definen el modificador de formato z para designar un size_t argumento (por lo tanto "%zu"por ejemplo), y definen t para designar un ptrdiff_t (por eso "%td"por ejemplo).
–Jonathan Leffler
31 de marzo de 2015 a las 14:45
yo siempre voy al estandar (enlace PDF) por esas cosas; no son demasiado complicados una vez que descubres los patrones en los que están configurados. La sección relevante es §7.8 Conversión de formato de tipos enteros <inttypes.h>.
HP tiene una buena referencia sobre cómo escribir código portátil y brinda algunos consejos específicos para usar inttypes.h
Siempre empiezo en Wikipedia para buscar un encabezado. <inttypes.h> parece ser muy problemático en Wikipedia. El siguiente paso que daría entonces sería este sitio. Este sitio anterior enumera cada macro y da un ejemplo. También podrías consultar este sitio, 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.
¿Ha sido útil esta solución?
Tu feedback nos ayuda a saber si la solución es correcta y está funcionando. De esta manera podemos revisar y corregir el contenido.
Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos.
Configurar y más información
¿Qué quiere decir exactamente con “compilaciones mixtas de 32/64 bits”? ¿Se esperará que el usuario utilice los tipos de ‘tamaño fijo’ de
stdint.h
? ¿Hay algo en particular que falta en la respuesta de Edwin que llevó a que se agregara la recompensa?– Michael Burr
15 de junio de 2011 a las 0:44
@Michael: Sí, el problema surge cuando usa tipos enteros de ancho conocido como
int64_t
bajo LP64 donde eso corresponde along
. El especificador de formato adecuado es%ld
en ese caso, pero si se basa en un sistema de 32 bits donde corresponde along long
entonces necesitas%lld
. Esperaba una descripción que motivara el uso de<inttypes.h>
(como lo hago brevemente en este comentario), además de proporcionar ejemplos. Algo que pudiera señalar para ahorrarme tener que explicar el por qué y el cómo.– Ben Jackson
15 de junio de 2011 a las 4:02