Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

270
Views
¿Cuál es la diferencia entre "int" y "int_fast16_t"?

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:

  • Mi pregunta estaba equivocada en muchos sentidos. El estándar C no especifica el bitness para int . Da un rango [-32767,32767] que debe contener.
  • Me doy cuenta de que al principio la mayoría de la gente diría, "¡pero ese rango implica al menos 16 bits!" Pero C no requiere almacenamiento de enteros en complemento de dos. Si hubieran dicho "16 bits", puede haber algunas plataformas que tengan una paridad de 1 bit, un signo de 1 bit y una magnitud de 14 bits que todavía estarían "cumpliendo con el estándar", pero que no satisfarían ese rango.
  • El estándar no dice nada acerca de que int sea el tipo más eficiente. Además de los requisitos de tamaño anteriores, el desarrollador del compilador puede decidir int en función de los criterios que considere más importantes. (velocidad, tamaño, compatibilidad con versiones anteriores, etc.)
  • Por otro lado, int_fast16_t es como proporcionar una pista al compilador de que debe usar un tipo que sea óptimo para el rendimiento, posiblemente a expensas de cualquier otra compensación.
  • Del mismo modo, int_least16_t le diría al compilador que use el tipo más pequeño que sea >= 16 bits, incluso si fuera más lento. Bueno para preservar el espacio en grandes arreglos y esas cosas.

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)

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

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.

over 4 years ago · Santiago Trujillo Report

0

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_t designa el tipo de entero con signo más rápido con un ancho de al menos N. El nombre typedef uint_fastN_t designa el tipo de entero sin signo más rápido con un ancho de al menos N ".

over 4 years ago · Santiago Trujillo Report

0

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.

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 rango INT_MIN a INT_MAX como 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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!