2011-04-04 14 views
5
signed long long value = -2147483648; 
    cout << ((signed long long)value); 

salidas 2147483648 (sin signo menos), ¿por qué?No se puede asignar el valor de INT_MIN a un largo largo

+0

¿Se supone que el título dice realmente lo que hace? – Mehrdad

+0

@Mehrdad: ¿algo mejor? –

+0

@Erik: bueno, INT_MIN es -2147483648 en mi implementación. En una implementación de magnitud de signo, INT_MIN estaría bien (ya que, por ejemplo, si es -2147483647, entonces 2147483647 es representable como int), e INT_MIN-1 sería el primer problema potencial. –

Respuesta

8
signed long long value = -2147483648; 

2147483648 no se puede representar en un entero de 32 bits, por lo que se convierte en se aplica (que no cambia nada) un signo menos sin signo, entonces unario, y luego se asigna a la firmado largo largo. Use -2147483648LL

+0

@Mitch: el literal no es un largo firmado. La variable es – Erik

+0

@Erik: ¡ah! ... –

+0

@Erik sí, sí funciona con LL (supongo que durante mucho tiempo), ¿hay algún otro "postfix" en un literal? –

1

Un entero literal, en C++, tiene el tipo int. Si no encaja en ese tipo, puede interpretarse como un entero sin signo. Sin embargo, no se garantiza que se tratará automáticamente como un tipo de entero más grande.

La norma, afortunadamente, admite una notación de sufijo para especificar el tipo explícito del literal.

En este caso, debe usar -2147483648LL.

+0

gracias, muy buena explicación +1 –

+0

"no se garantiza que se trate automáticamente como un tipo de entero más grande". - Bueno, 2.13.1/2 garantiza que se tratará como 'long int', pero que bien podría ser no más grande que' int'. –

+0

El estándar no admite 'LL' hasta C++ 0x. –

0

Su código original puede contener un comportamiento indefinido, pero parece más como un error de compilación para mí. Como han señalado otros, la constante 2147483648 no se puede representar en un int de 32 bits. Según el estándar, "El tipo de un entero literal depende de su forma, valor y sufijo. Si es decimal y tiene sin sufijo, tiene el primero de estos tipos en que se puede representar su valor : int, long int; si el valor no puede ser representado como un int largo, el comportamiento no está definido. " El borrador C++ 0x agrega mucho tiempo al final de estos.

Si LONG_MAX es mayor que 2147483648, entonces el tipo del literal es largo, y el signo menos debe dar el valor correcto. De lo contrario, si el compilador ya admite long long (y desde está declarando una variable de este tipo, se debe suponer que sí), el tipo de 2147483648 es long long, y el menos debe dar el valor correcto . Si el compilador no es compatible con largo y largo solo 32 bits, entonces su código tiene un comportamiento indefinido de , por lo que todo lo que hace el compilador es "correcto".

Cuestiones relacionadas