2011-02-18 11 views
6

Questo programma è scritto in VC++ 6.0 su un computer WindowsXP.Perché non posso impostare direttamente una variabile __int64 a -2500000000?

Se si tenta di impostare direttamente una variabile __int64 a -2500000000, viene troncato a un valore a 32 bit e viene preso il complemento a due.

__int64 testval; 
testval = -2500000000; 

A questo punto testVal uguale 1794967293 (110 1010 1111 1101 0000 0111 0000 0000 binario).

Quando ho impostato la variabile di 2500 milioni e poi moltiplicare per uno negativo, così:

__int64 testval; 
testval = 2500000000; 
testval *= -1; 

Il testVal variabile è uguale -2500000000 (1001 0101 0000 0010 1111 1001 0000 0000 binario).

Qualche idea? Grazie.

+3

MSVC6? Ahia! Fa male! –

risposta

10

Ottenere un compilatore più recente. La conformità allo standard VC6 è MOLTO povera.

In VC6, provare un suffisso di i64, come in

__int64 toobig = -2500000000i64; 

Trovato the documentation!

+0

Grazie, sarebbe il metodo preferito, ma al momento non è un'opzione. –

+0

@E: Penso di avere la soluzione per VC6, ma non ho più una copia installata dove posso testarla. –

+0

Che funziona. Grazie! Questo deve essere collegato nella loro documentazione per __int64. –

9

Il compilatore tratta la costante 2500000000 come numero a 32 bit. È necessario dirlo esplicitamente per considerarlo come long int aggiungendo uno LL alla fine della costante. Quindi, provate invece:

testval = -2500000000LL;

Aggiornamento: Dal momento che il compilatore non supporta questo, e si è bloccato con VC6, provare invece la rottura in un valore che risulta dal prodotto di due numeri a 32 bit come in:

testval = -250000; 
testval *= 10000;
+1

Probabilmente è più sicuro renderlo 'LL' piuttosto che' L' –

+0

Che (il compilatore usa un tipo a 32-bit per quel letterale) è una violazione della sezione C++ 0x '[lex.icon]' ... qualcuno ha la formulazione da C++ 03 o C++ 98? –

+2

C++ 03 probabilmente non aiuterà molto, considerando Visual C++ 6 spedito alla fine degli anni '90. – ChrisV

2

La sintassi corretta è -2500000000LL. Se non funziona, ottieni un compilatore più recente.

Problemi correlati