Diferencia entre INT_MAX y __INT_MAX__ en C

9 minutos de lectura

Avatar de usuario de Magic Thanos
mágico thanos

¿Cuál es la diferencia entre los 2? __INT_MAX__ se define sin agregar una biblioteca hasta donde yo sé y INT_MAX se define en limits.h pero cuando incluyo la biblioteca INT_MAX se expande a __INT_MAX__ de cualquier manera (o eso dice VSCode). ¿Por qué alguna vez usaría el limits.h uno cuando se expande al otro?

  • Hay buena información sobre guiones bajos iniciales en esta pregunta SO.

    – AdrianHHH

    17 de diciembre a las 12:16


  • Aplique etiquetas específicas (por ejemplo, qué idioma) a su pregunta.

    – MoMo

    hace 4 horas

Avatar de usuario de Andreas Wenzel
Andreas Wenzel

Siempre debes usar INT_MAXya que esa es la macro constante definida por el estándar ISO C.

La macroconstante __INT_MAX__ no está especificado por ISO C, por lo que no debe usarse, si desea que su código sea portátil. Esa macro es simplemente un detalle de implementación del compilador que está utilizando. Otros compiladores probablemente no definirán esa macro e implementarán INT_MAX de alguna otra manera.

avatar de usuario de dbush
arbusto

__INT_MAX__ es una macro definida por la implementación, lo que significa que no todos los sistemas pueden tenerla. En particular, GCC define esta macro pero MSVC no.

Por otro lado, INT_MAX está definido por el estándar C y se garantiza que estará presente en limits.h para cualquier compilador conforme.

Entonces, para la portabilidad, use INT_MAX.

  • Clang también define INT_MAXcomo parte de su funcionalidad “Funciona mucho como GCC”,

    – John Dalman

    17 dic a las 18:01

  • Creo que es más “funciona como un compilador ac” -)

    – gnasher729

    18 de diciembre a las 1:16

  • @gnasher729: Creo que John Dallman escribió INT_MAX (con guiones bajos al principio y al final) pero quería decir __INT_MAX__ (con comillas invertidas adjuntas) en su lugar.

    – Édgar Bonet

    18 dic a las 13:12

  • prueba_con_guiones bajos iniciales y finales

    – Óscar Skog

    18 dic a las 16:32

  • Una pudo también use barras invertidas: \_\_INT_MAX\_\_ ⇒ __INT_MAX__, o incluso _\_INT_MAX_\_ ⇒ __INT_MAX__. Pero sí, ya que estamos hablando de código, deberíamos usar formato de código.

    – Scott – Слава Україні

    18 dic a las 20:14

¿Por qué alguna vez usaría los límites. h uno cuando se expande al otro?

limits.h es estándar y portátil.

Cada implementación del lenguaje C es libre de crear el valor de macros como INT_MAX como crea conveniente. Él __INT_MAX__ el valor que está viendo es un artefacto de su compilador particular, y tal vez incluso la versión particular del compilador que está usando.

Avatar de usuario de John Dallman
Juan Dallman

Para agregar a las otras respuestas, cuando está escribiendo código que se ejecutará en varias plataformas, De Verdad vale la pena apegarse a las normas. Si no lo hace, cuando aparece una nueva plataforma, tiene mucho trabajo que hacer para adaptarla, y la mejor manera de hacerlo suele ser cambiarla para que se ajuste al estándar. Este trabajo es muy aburrido y poco interesante, y bien vale la pena evitarlo haciendo las cosas bien desde el principio.

Trabajo en un modelador matemático que se escribió originalmente en la década de 1980 en VAX/VMSy en sus inicios admitía varias plataformas 68000, incluidas Apolo/Dominio. Hoy en día, se ejecuta en Windows, Linux, macOS, Android e iOS de 64 bits, ninguno de los cuales existió cuando fue creado.

avatar de usuario de lee joe
lee joe

__INT_MAX__ es una macro predefinida en el preprocesador C que especifica el valor máximo de un tipo int en una plataforma particular. Este valor está definido por la implementación y puede variar entre diferentes plataformas.

INT_MAX es una constante definida en el archivo de encabezado limits.h que especifica el valor máximo de un tipo int. Se define de la siguiente manera:

define INT_MAX __INT_MAX__

El archivo de encabezado limits.h es parte de la biblioteca estándar de C y proporciona varias constantes que especifican los límites de varios tipos, como los valores mínimo y máximo de los tipos int, long y long long.

La razón por la cual INT_MAX Se define como __INT_MAX__ es porque __INT_MAX__ es una macro predefinida que especifica el valor máximo de un tipo int en una plataforma particular, e INT_MAX es simplemente un alias para este valor.

Puedes usar cualquiera __INT_MAX__ o INT_MAX para obtener el valor máximo de un tipo int, pero generalmente se recomienda usar INT_MAX ya que se define en un archivo de encabezado de biblioteca estándar y, por lo tanto, es más portátil.

  • __INT_MAX__ no está definida por la implementación. Ese término, en el contexto de C, significa el estándar C requiere una implementación para especificar cuál es la definición. El estándar C no hace tal requisito para __INT_MAX__. Una implementación puede definir __INT_MAX__pero el término “definido por la implementación” no debe usarse para describir eso.

    –Eric Postpischil

    18 dic a las 16:20

  • __INT_MAX__ es un nombre reservado para uso interno de la implementación; tenga en cuenta los dos guiones bajos seguidos de una letra mayúscula. Lo que está describiendo es solo la elección de implementación de GCC/glibc. (Donde ponen la constante numérica real en el compilador, en lugar de necesitar diferentes versiones de limits.h para objetivos con 16 bits into 32 frente a 64 bits long.)

    – Peter Cordes

    19 dic a las 19:48


  • @EricPostpischil ¿cuál es el término correcto para este concepto? Habría usado “definición de implementación” para referirme a cualquier característica que admita y documente una implementación en particular, no necesariamente algo requerido por el estándar.

    – PC Ludita

    hace 2 días

  • @PCLuddite: En su mayoría, simplemente evitaría la frase específica “definido por implementación”, ya que el estándar C lo usa para significar cosas que se requiere que defina una implementación. Podría decir “GCC define __INT_MAX__ ser el valor máximo de un int” o “Algunas implementaciones de C definen __INT_MAX__,” etcétera. No estoy seguro de que GCC realmente documente __INT_MAX__ para uso ordinario del programador. Puede ser algo que defina para que los implementadores de la biblioteca estándar C usen en los encabezados, para que puedan escribir #define INT_MAX __INT_MAX__ hacer una cabecera que se adapte a diferentes target…

    –Eric Postpischil

    hace 2 días


  • … En general, podría decir que una implementación define algo como una extensión, o que especifica ciertas cosas, u otra frase adecuada para el problema en particular. Simplemente evite “definido por implementación”.

    –Eric Postpischil

    hace 2 días

Avatar de usuario de Satish Chandra Gupta
Satish Chandra Gupta

En el lenguaje de programación C, INT_MAX es una macro que se expande al valor máximo que se puede almacenar en una variable de tipo int. Este valor está definido por la implementación, lo que significa que puede variar según la implementación de C específica que se utilice. En la mayoría de los sistemas, int es un tipo de datos de 32 bits y INT_MAX se define como 2147483647, que es el valor máximo que se puede almacenar en un entero complemento a dos de 32 bits.

Por otro lado, __INT_MAX__ es una macro predefinida que representa el valor máximo que se puede almacenar en una variable de tipo int en el sistema donde se compila el programa C. Me gusta INT_MAXEl valor de __INT_MAX__ está definido por la implementación y puede variar según la implementación de C específica que se utilice. Sin embargo, __INT_MAX__ es establecido por el compilador durante la compilación, mientras que INT_MAX normalmente se define en un archivo de encabezado (por ejemplo, limites.h) e incluidos en el programa en tiempo de ejecución.

En general, se recomienda utilizar INT_MAX en vez de __INT_MAX__ en programas C, como INT_MAX es portátil y funcionará en cualquier sistema, mientras que __INT_MAX__ es específico del sistema en el que se está compilando el programa.

  • __INT_MAX__ no está definida por la implementación. Ese término, en el contexto de C, significa el estándar C requiere una implementación para especificar cuál es la definición. El estándar C no hace tal requisito para __INT_MAX__. Una implementación puede definir __INT_MAX__pero el término “definido por la implementación” no debe usarse para describir eso.

    –Eric Postpischil

    18 dic a las 16:20

  • __INT_MAX__ es un nombre reservado para uso interno de la implementación; tenga en cuenta los dos guiones bajos seguidos de una letra mayúscula. Lo que está describiendo es solo la elección de implementación de GCC/glibc. (Donde ponen la constante numérica real en el compilador, en lugar de necesitar diferentes versiones de limits.h para objetivos con 16 bits into 32 frente a 64 bits long.)

    – Peter Cordes

    19 dic a las 19:48


  • @EricPostpischil ¿cuál es el término correcto para este concepto? Habría usado “definición de implementación” para referirme a cualquier característica que admita y documente una implementación en particular, no necesariamente algo requerido por el estándar.

    – PC Ludita

    hace 2 días

  • @PCLuddite: En su mayoría, simplemente evitaría la frase específica “definido por implementación”, ya que el estándar C lo usa para significar cosas que se requiere que defina una implementación. Podría decir “GCC define __INT_MAX__ ser el valor máximo de un int” o “Algunas implementaciones de C definen __INT_MAX__,” etcétera. No estoy seguro de que GCC realmente documente __INT_MAX__ para uso ordinario del programador. Puede ser algo que defina para que los implementadores de la biblioteca estándar C usen en los encabezados, para que puedan escribir #define INT_MAX __INT_MAX__ hacer una cabecera que se adapte a diferentes target…

    –Eric Postpischil

    hace 2 días


  • … En general, podría decir que una implementación define algo como una extensión, o que especifica ciertas cosas, u otra frase adecuada para el problema en particular. Simplemente evite “definido por implementación”.

    –Eric Postpischil

    hace 2 días

Avatar de usuario de Abhiranjan tiwari
Abhiranjan tiwari

INT_MAX es una macro que especifica que una variable entera no puede almacenar ningún valor más allá de este límite.

INT_MIN especifica que una variable entera no puede almacenar ningún valor por debajo de este límite.

Los valores de INT_MAX e INT_MIN pueden variar de un compilador a otro. Los siguientes son valores típicos en un compilador donde los enteros se almacenan usando 32 bits.

El valor de INT_MAX es +2147483647. El valor de INT_MIN es -2147483648.

¿Ha sido útil esta solución?