c++ - ¿Por qué el valor int más negativo causa un error sobre sobrecargas de funciones ambiguas?
integer function-overloading (3)
Este es un error muy sutil. Lo que está viendo es una consecuencia de que no haya literales enteros negativos en C ++. Si miramos [lex.icon] obtenemos que un literal entero ,
literal-entero
Opción de sufijo entero-decimal decimal
[...]
puede ser un decimal decimal ,
decimal-literal:
dígito distinto de cero
decimal-literal ''dígito opt
donde el
dígito
es
[0-9]
y
el dígito distinto de cero
es
[1-9]
y el sufijo par puede ser uno de
u
,
U
,
l
,
L
,
ll
o
LL
.
En ninguna parte aquí se incluye
-
como parte del literal decimal.
En §2.13.2, también tenemos:
Un literal entero es una secuencia de dígitos que no tiene período ni parte de exponente, con comillas simples de separación opcionales que se ignoran al determinar su valor. Un literal entero puede tener un prefijo que especifica su base y un sufijo que especifica su tipo. El primer dígito léxico de la secuencia de dígitos es el más significativo. Un literal entero decimal (base diez) comienza con un dígito distinto de 0 y consiste en una secuencia de dígitos decimales.
(énfasis mío)
Lo que significa que
-
en
-2147483648
es el
operator -
unario
operator -
.
Eso significa que
-2147483648
realidad se trata como
-1 * (2147483648)
.
Dado que
2147483648
es demasiado para su
int
, se promociona a un
long int
y la ambigüedad proviene de que no coincide.
Si desea obtener el valor mínimo o máximo para un tipo de forma portátil, puede usar:
std::numeric_limits<type>::min(); // or max()
Estoy aprendiendo sobre la sobrecarga de funciones en C ++ y me encontré con esto:
void display(int a)
{
cout << "int" << endl;
}
void display(unsigned a)
{
cout << "unsigned" << endl;
}
int main()
{
int i = -2147483648;
cout << i << endl; //will display -2147483648
display(-2147483648);
}
Por lo que entendí, cualquier valor dado en el rango
int
(en mi caso
int
es de 4 bytes) llamará a
display(int)
y cualquier valor fuera de este rango será ambiguo (ya que el compilador no puede decidir qué función llamar).
Es válido para el rango completo de valores
int
excepto su valor mínimo, es decir,
-2147483648
donde la compilación falla con el error
la llamada de
display(long int)
sobrecargadadisplay(long int)
es ambigua
Pero tomar el mismo valor a
int
e imprimir el valor da
2147483648
.
Estoy literalmente confundido con este comportamiento.
¿Por qué se observa este comportamiento solo cuando se pasa el número más negativo?
(El comportamiento es el mismo si se usa un
short
con
-32768
, de hecho, en cualquier caso donde el número negativo y el número positivo tienen la misma representación binaria)
Compilador utilizado: g ++ (GCC) 4.8.5
La expresión
-2147483648
realidad está aplicando el operador
-
a la constante
2147483648
.
En su plataforma,
int
no puede almacenar
2147483648
, debe estar representado por un tipo más grande.
Por lo tanto, no se deduce que la expresión
-2147483648
esté
signed int
sino un tipo con signo más grande, con
signed long int
.
Como no proporciona una sobrecarga por
long
el compilador se ve obligado a elegir entre dos sobrecargas que son igualmente válidas.
Su compilador debe emitir un error de compilación sobre sobrecargas ambiguas.
Ampliando las respuestas de otros
Para aclarar por qué el OP está confundido, primero
: considere la representación binaria
signed int
de
2147483647
, a continuación.
Luego, agregue uno a este número
: dando otro
signed int
de
-2147483648
(que el OP desea usar)
Finalmente:
podemos ver por qué el OP se confunde cuando
-2147483648
compila en un
long int
lugar de un
signed int
, ya que claramente cabe en 32 bits.
Pero, como mencionan las respuestas actuales, el operador unario (
-
) se aplica
después de
resolver
2147483648
que es un
long int
y NO cabe en 32 bits.