Según tengo entendido, la especificación C dice que se supone que el tipo int es el tipo más eficiente en la plataforma de destino que contiene al menos 16 bits.
¿No es eso exactamente lo que es la definición C99 de int_fast16_t también?
¿Tal vez lo pusieron allí solo por consistencia, ya que se necesitan los otros int_fastXX_t ?
Actualizar
Para resumir la discusión a continuación:
Ejemplo: MSVC en x86-64 tiene un int de 32 bits, incluso en sistemas de 64 bits. MS eligió hacer esto porque demasiadas personas asumieron que int siempre sería exactamente de 32 bits, por lo que muchas ABI se romperían. Sin embargo, es posible que int_fast32_t sea un número de 64 bits si los valores de 64 bits fueran más rápidos en x86-64. (Lo cual no creo que sea realmente el caso, pero solo demuestra el punto)
int es un "tipo más eficiente" en velocidad/tamaño, pero eso no está especificado por la especificación C. Debe ser de 16 o más bits.
int_fast16_t es el tipo más eficiente en velocidad con al menos el rango de un int de 16 bits.
Ejemplo: una plataforma determinada puede haber decidido que int debería ser de 32 bits por muchas razones, no solo por la velocidad. El mismo sistema puede encontrar que un tipo diferente es el más rápido para enteros de 16 bits.
Ejemplo: en una máquina de 64 bits, donde uno esperaría tener int como de 64 bits, un compilador puede usar un modo con compilación int de 32 bits para compatibilidad. En este modo, int_fast16_t podría ser de 64 bits, ya que es el ancho nativo más rápido para evitar problemas de alineación, etc.
Se garantiza que int_fast16_t es el int más rápido con un tamaño de al menos 16 bits. int no tiene ninguna garantía de su tamaño excepto que:
sizeof(char) = 1 and sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long).Y que puede contener el rango de -32767 a +32767.
(7.20.1.3p2) "El nombre typedef
int_fastN_tdesigna el tipo de entero con signo más rápido con un ancho de al menos N. El nombre typedefuint_fastN_tdesigna el tipo de entero sin signo más rápido con un ancho de al menos N ".
Según tengo entendido, la especificación C dice que se supone que el tipo
intes el tipo más eficiente en la plataforma de destino que contiene al menos 16 bits.
Esto es lo que el estándar realmente dice sobre int : ( borrador N1570 , sección 6.2.5, párrafo 5):
Un objeto
int"simple" tiene el tamaño natural sugerido por la arquitectura del entorno de ejecución (lo suficientemente grande como para contener cualquier valor en el rangoINT_MINaINT_MAXcomo se define en el encabezado<limits.h>).
La referencia a INT_MIN e INT_MAX quizás sea un poco engañosa; esos valores se eligen en función de las características de tipo int , no al revés.
Y la frase " el tamaño natural" también es un poco engañosa. Según la arquitectura de destino, es posible que no haya un solo tamaño "natural" para un tipo entero.
En otros lugares, el estándar dice que INT_MIN debe ser como máximo -32767 e INT_MAX debe ser al menos +32767 , lo que implica que int tiene al menos 16 bits.
Esto es lo que dice el estándar sobre int_fast16_t (7.20.1.3):
Cada uno de los siguientes tipos designa un tipo de entero con el que normalmente es más rápido operar entre todos los tipos de enteros que tienen al menos el ancho especificado.
con una nota al pie:
No se garantiza que el tipo designado sea el más rápido a todos los efectos; si la implementación no tiene motivos claros para elegir un tipo sobre otro, simplemente elegirá algún tipo entero que satisfaga los requisitos de firma y ancho.
Los requisitos para int e int_fast16_t son similares pero no idénticos, y son igualmente vagos.
En la práctica, el tamaño de int a menudo se elige en función de criterios distintos al "tamaño natural", o esa frase se interpreta por conveniencia. A menudo, el tamaño de int para una nueva arquitectura se elige para que coincida con el tamaño de una arquitectura existente, para minimizar la dificultad de portar el código. Y existe una motivación bastante fuerte para hacer que el int no supere los 32 bits, de modo que los tipos char , short e int puedan cubrir tamaños de 8, 16 y 32 bits. En los sistemas de 64 bits, en particular x86-64, el tamaño "natural" es probablemente de 64 bits, pero la mayoría de long compiladores de C int 32 bits en lugar de 64 (y algunos compiladores incluso tienen solo 32 bits).
La elección del tipo subyacente para int_fast16_t es, sospecho, menos dependiente de tales consideraciones, ya que cualquier código que lo use solicita explícitamente un tipo entero rápido de 16 bits con signo. Una gran cantidad de código existente hace suposiciones sobre las características de int que van más allá de lo que garantiza el estándar, y los desarrolladores de compiladores tienen que atender dicho código si quieren que se usen sus compiladores.