c++ c++11 int int64 numeric-limits

c++ - ¿Por qué el tipo entero int64_t no tiene este valor legal?



c++11 numeric-limits (2)

Ben ya ha explicado la razón, aquí hay otras dos posibles soluciones.

Prueba esto

int64_t a = INT64_MIN;

o esto

int64_t a = std::numeric_limits<int64_t>::min();

Estoy tratando de escribir un caso de prueba para un caso de esquina. Para la entrada de tipo int64_t , la siguiente línea no se compilará:

int64_t a = -9223372036854775808LL;

El error / advertencia es:

error: integer constant is so large that it is unsigned [-Werror]

Pensé que el número estaba fuera de rango, así que intenté:

std::cout << std::numeric_limits<int64_t>::min() << std::endl;

Produce exactamente el mismo número !!! Así que la constante está dentro del rango.

¿Cómo puedo solucionar este error?


Usted puede escribir

int64_t a = -1 - 9223372036854775807LL;

El problema es que el - no es parte del literal, es un menos unario. Así que el compilador primero ve 9223372036854775808LL (fuera de rango para int64_t firmado) y luego encuentra el negativo de esto.

Al aplicar el signo menos binario, podemos usar dos literales que están dentro del rango.