Buena introducción a [closed]

4 minutos de lectura

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.

    – Ben Jackson

    15 de junio de 2011 a las 4:02

avatar de usuario
edwin dólar

Tratar http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/inttypes.h.html para comenzar.

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

Escritura de código portátil

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?

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
Privacidad