2016-01-11 8 views
12

mio frammento:Perché MSVC seleziona una lunghezza lunga come il tipo per -2147483648?

auto i = -2147483648; 
int j = 3; 
std::swap(i, j); // Compile error about mismatched types here. 

Il compilatore afferma che il letterale i è un long long. Perché? -2147483648 si adatta a un int su MSVC x64.

Il mio compilatore è MSVC, l'obiettivo è 64 bit.

+1

correlati [Numero minimo di 32 bit di fusione (-2147483648) per il numero di serie positivo (2147483648.0)] (http://stackoverflow.com/q/11536389/995714), [Perché 0 <-0x80000000?] (http://stackoverflow.com/q/34182672/995714), [(-2147483648> 0) restituisce true in C++?] (http://stackoverflow.com/q/14695118/995714) –

+1

Per divertimento, cerca il tuo definizione del compilatore di 'INT_MIN'. Anche quando 'INT' è 32 bit,' INT_MIN' non è definito come '(-2147483648)' proprio per questo motivo. – MSalters

+1

Sono esitante a chiudere questo duplicato dell'ultima domanda; opinioni benvenute – MSalters

risposta

29

Contrariamente a quanto si crede, -2147483648 è non un letterale: C++ non supporta valori letterali negativi.

È, infatti, un fase di compilazione valutabile espressione costante costituito da una negazione unaria della letterale 2147483648.

In MSVC x64, che ha 32 bit int s e long s, 2147483648 è troppo grande per entrambi, quindi non riesce al tipo long long che si osserva.

+0

@ P45Imminente, abbiamo avuto la stessa domanda nel tag C 30 minuti fa, chiuso come duplicato. – SergeyA

+0

@ P45Imminente, questa è la domanda di cui sto parlando: http://stackoverflow.com/questions/34724320/printf-d-or-i-minimum-int-value/34724513?noredirect=1#comment57195717_34724513 – SergeyA

+0

Ho lo ha appena svalutato. A proposito, non sono a scuola. Lavoro con Bathsheba. Ma quello sembra convertirsi in un lungo. –

Problemi correlati