2010-11-03 17 views
6

Je suis confus!1000000000 * 3 = -1294967296?

Aujourd'hui est le 3 Novembre

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

Shazbot sort à -1294967296

Huh ???

+0

Je n'ai jamais utilisé C# mais on dirait que votre long est de 32 bits. Signé. hein. –

+0

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

+0

Essayez de multiplier l'autre paire de System :: Int32 et System :: Int64. Je ne suis pas C# dev, juste intéressé. – foret

Répondre

41

shazbot peut être un long, mais ni 1000000000 ou DateTime.Day sont. Donc, C# fait int multiplication en premier (ce qui entraîne un débordement) puis le transforme en long pour stocker dans shazbot.

Si vous voulez un résultat long, faire l'un d'eux un long, comme ceci:

long shazbot = 1000000000L * DateTime.Day;

Edit: C# vous donne un avertissement si vous utilisez l au lieu de L. Fixé.

+0

Comment convertir mes valeurs en longues? Convert.ToInt64? – sooprise

+1

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

+0

J'ai utilisé ce tour" l ", travaillé comme un charme. Merci! : D – sooprise

1

Cast pour longtemps comme ceci:

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

Il suffit de lancer l'un d'eux à long pour obtenir l'expression à évaluer aussi longtemps. –

+0

Trop de choses à écrire. Il n'y a absolument aucun besoin de jeter les deux opérandes. L'un est suffisant. La seconde sera implicitement castée dans le bon type. Ou, comme R. Bemrose l'a suggéré, écrire un littéral long au lieu du littéral int par défaut, de sorte qu'aucun casting ne soit nécessaire dans ce cas. – AlexanderMP

+0

Merci, je vais changer mon exemple. – jlafay