2009-12-23 26 views
7

¿Qué puedo hacer (programáticamente) para deshacerme de la advertencia?g ++: advertencia: la constante entera es demasiado grande para el tipo 'largo'

... 
unsigned long long v=(unsigned long long)0xffffeeeeddddcccc; 
... 

g++ main.cpp -o main 
main.cpp:6: warning: integer constant is too large for ‘long’ type 

pero cuando ejecuto el programa todo está bien como se esperaba:

./main 
    sizeof(unsigned long long)==8 
    value of v==0xffffeeeeddddcccc 

entorno utilizado: 32 bits

  • Ubuntu-Kármico
  • g ++ versión: v4.4.1

EDITAR: aquí es la completa y compilable main.cpp

#include <iostream> 
#include <iomanip> 
using namespace std; 

int main(void) { 
    unsigned long long v=(unsigned long long)0xffffeeeeddddcccc; 
    const unsigned v_size = sizeof(unsigned long long); 
    cout << "sizeof(unsigned long long)==" << v_size << endl; 
    cout << "value of v==0x" << setw(v_size) << setfill('0') << hex << v << endl; 
    return 0; 
} 

Respuesta

12

Según C++ Standard 2.13.1/2:

El tipo de un literal entero depende de su forma, el valor, y sufijo. Si es decimal y no tiene sufijo, tiene el primero de estos tipos en que se puede representar su valor: int, long int; si el valor no se puede representar como un int largo, el comportamiento no está definido.

Nuevo C++ Estándar permite usar el sufijo ull. g ++ 4.4.1 admite este sufijo además de Visual C++ 2008. Puede usarlo de la siguiente manera:

unsigned long long v=0xffffeeeeddddccccULL; 
+0

Nunca antes había visto esto 'ull'. ¿Podría darme una referencia? –

+0

'ull' es una parte del nuevo estándar de C++. g ++ 4.4.1 admite este sufijo. –

+2

Prefiero escribir el 'ULL' y otros sufijos en mayúsculas para que sean visualmente distintos. Con el 'u' no es una gran preocupación, pero con' l' o 'll' es demasiado fácil confundirlo con' 1'. – JaakkoK

Cuestiones relacionadas