¿Por qué definimos INT_MIN como -INT_MAX – 1? [duplicate]

4 minutos de lectura

avatar de usuario
Crátilo

AFAIK este es un “modismo” estándar

#  define INT_MIN   (-INT_MAX - 1)  
#  define INT_MAX   2147483647    

Pregunta: ¿Por qué la definición de INT_MIN no es -2147483648?

  • si los define a ambos por separado, cuando quiera hacer una modificación, debe recordar cambiar ambos. si uno de ellos depende del otro, puede cambiar uno y el cambio se aplicará a ambos.

    – Jason Hu

    23/09/2014 a las 20:12

  • @HuStmpHrrr: leí que hay una razón, pero no hubo explicación de esa razón (estaba relacionado con los compiladores y no con el diseño del código)

    – Crátilo

    23/09/2014 a las 20:16

  • lamentablemente no tengo gcc conmigo actualmente. pero creo que puedes intentarlo int foo = -2147483648; directamente y ver si el compilador se queja. tengo curiosidad por el resultado.

    – Jason Hu

    23/09/2014 a las 20:22

  • No soy un gran admirador del hecho de que cuando lo marco como “posible duplicado” se estampa “duplicado” inmediatamente. Pero de todos modos, la pregunta se ha hecho muchas veces antes.

    – Ant

    23/09/2014 a las 20:39


  • @AndreyT Estoy de acuerdo. Fue agradable y todo ese poder dicho para engañar instantáneamente se otorgó a aquellos de nosotros con suficiente locura para construir una alta reputación, pero hubiera preferido que me hubieran dado una opción al viejo estilo, nominarlo como un duplicado como una alternativa si sentimos que lo es, pero nos gustaría tener el peso extra de nuestros compañeros detrás de él. No creo que sea una característica difícil de agregar. Tal vez algo para lanzar en meta.

    – WhozCraig

    23/09/2014 a las 20:59


avatar de usuario
ouah

Porque 2147483648 es un long valor ya que no encaja en un int (en sistema común con 32 bits int y 64 bits longen sistema con 32 bits long es de tipo long long). Entonces -2147483648 es de tipo longno int.

Recuerde en C, una constante entera decimal sin sufijo es del primer tipo int, long o long long donde se puede representar.

También en C -2147483648 no es una constante entera; 2147483648 es una constante entera. -2147483648 es una expresión formada con el operador unario - y la constante entera 2147483648.

EDITAR: si no estas convencido -2147483648 no es de tipo int (algunas personas en los comentarios todavía parecen dudar), puede intentar imprimir esto:

printf("%zu %zu\n", sizeof INT_MIN, sizeof -2147483648);

Lo más probable es que termines con:

4 8

en sistemas comunes de 32 y 64 bits.

También para seguir un comentario, estoy hablando de C Standard reciente: use el dialecto c99 o c11 para probar esto. Las reglas de c89 para constantes enteras decimales son diferentes: -2147483648 es de tipo unsigned long en c89. De hecho, en c89 (es diferente en c99, ver arriba), una constante entera decimal sin sufijo es del tipo int, long o unsigned long.

EDIT2: @WhozCraig agregó otro ejemplo (pero para C++) para mostrar -2147483648 no es de tipo int.

El siguiente ejemplo, aunque en C++, aclara este punto. Fue compilado con una arquitectura g++ de 32 bits. Tenga en cuenta la información de tipo recopilada de la deducción del parámetro pasado:

#include <iostream>
#include <climits>

template<typename T>
void foo(T value)
{
    std::cout << __PRETTY_FUNCTION__ << '\n';
    std::cout << value << '\n';
}

int main()
{
    foo(-2147483648);
    foo(INT_MIN);
    return 0;
}

Producción

void foo(T) [T = long long]
-2147483648
void foo(T) [T = int]
-2147483648

  • Lo siento, no entiendo. Esta -2147483648 se considera un long?

    – Crátilo

    23/09/2014 a las 20:14

  • Más al punto. menos unario se aplica a un expresióncuyo tipo ya ha sido establecido por el valor. 2147483648 como un valor (antes de aplicar unario-menos) no es representable como int en un sistema de 32 bits.

    – WhozCraig

    23/09/2014 a las 20:14


  • No creo que esto sea lo que preguntó OP, ya que INT_MIN se define usando INT_MAX, OP se pregunta por qué INT_MIN no se define usando una constante (como INT_MAX).

    – Inválido

    23/09/2014 a las 20:16

  • @WhozCraig: Lo que dices tiene sentido

    – Crátilo

    23/09/2014 a las 20:17

  • @ouah:Because 2147483648 is a long value as it does not fit an int pero el numero es -2147483648 y es parte del rango para int.

    – Crátilo

    23/09/2014 a las 20:20

¿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