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?
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?
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 long
en sistema con 32 bits long
es de tipo long long
). Entonces -2147483648
es de tipo long
no 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
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