2010-11-03 3 views
6

Sono confuso!1000000000 * 3 = -1294967296?

Oggi è il 3 novembre

DateTime DateTime = new DateTime(2010,11,3); 
long shazbot = 1000000000 * DateTime.Day; 

shazbot esce per -1.294,967296 millions

Eh ???

+0

Non ho mai usato C# ma sembra che il tuo lungo sia 32 bit. Firmato. eh. –

+0

@Josh, in C# 'longs' sono [64-bit] (http://msdn.microsoft.com/en-us/library/ctetwysk%28VS.71%29.aspx) di larghezza. –

+0

Prova a moltiplicare altre coppie di System :: Int32 e System :: Int64. Non sono C# dev, sono solo interessato. – foret

risposta

41

shazbot può essere un long, ma né 1000000000 o DateTime.Day sono. Quindi, C# compie prima la moltiplicazione int (che si traduce in un overflow) quindi la inserisce in un long da memorizzare in shazbot.

Se si desidera un risultato long, fare uno di loro un long, come questo:

long shazbot = 1000000000L * DateTime.Day;

Edit: C# ti dà un messaggio di avviso se si utilizza l invece di L. Fisso.

+0

Come posso convertire i miei valori in long? Convert.ToInt64? – sooprise

+1

Cast? '(long) DateTime.Day' – AlexanderMP

+0

Ho usato quel trucco" l ", ha funzionato come un incantesimo. Grazie! : D – sooprise

1

Fusioni a lungo in questo modo:

long shazbot = 1000000000L * DateTime.Day; 
+1

Basta castarne uno a "long" per ottenere l'espressione da valutare quanto a lungo. –

+0

Troppo da scrivere. Non è assolutamente necessario eseguire il cast di entrambi gli operandi. Uno è sufficiente. Il secondo sarà implicitamente inserito nel giusto tipo. Oppure, come suggerito da R. Bemrose, scrivere un letterale Long invece del valore letterale int predefinito, in modo che in questo caso non sia necessario alcun cast. – AlexanderMP

+0

Grazie cambierò il mio esempio. – jlafay