2009-12-30 11 views
0

Récemment, j'ai commencé à créer un conteneur d'éléments et chaque fois que l'utilisateur essayait d'ajouter un élément dans le conteneur. Si en quelque sorte le même type d'élément existe, il va les empiler les uns sur les autres, mais il y a une limite, qui est int.MaxValue et si j'ai essayé:.NET/C# - Autoriser le débordement d'entiers

if (2147483647 + 2147483647 > int.MaxValue) 

Cela me donnerait l'erreur suivante:

The operation overflows at compile time in checked mode 

donc j'ai essayé d'utiliser le mot-clé sans contrôle comme ceci:

unchecked 
{ 
    if (2147483647 + 2147483647 > int.MaxValue) 
    { 
    } 
} 

mais cela ne montre pas déclencher l'instruction if du tout (je devine qu'il est enroulé autour d'un opérateur AND logique?)

Existe-t-il d'autres moyens de le faire? (sans utiliser quelque chose comme un int64, etc)

+0

pourquoi vous ajoutez deux constantes qui sont égales à Int.MaxValue et en les comparant à Int.MaxValue? –

+0

@GregS, ceci est juste un exemple. – TheAJ

+0

quelle est la question exacte, bien sûr deux int.MaxValues ​​sont plus grands que int.MaxValue. – GrayWizardx

Répondre

2

Si une opération int déborde, elle ne va pas tester plus de Int32.MaxValue.

Si vous voulez que cette condition soit vraie, utilisez des longs.

if (2147483647L + 2147483647L > int.MaxValue) ... 

Vous pouvez également utiliser uint s.

if (2147483647U + 2147483647U > (uint)int.MaxValue) ... 
+0

ou vous pourriez noter, comme le compilateur le fera sans aucun doute, que la condition est toujours vraie. –

1

Essayez de lancer les deux à uint (unsigned) si vous n'avez pas besoin de la moitié négative de l'espace binaire. Même largeur de bit, ne roule pas après Int.MaxValue (par exemple, il est 2x l'amplitude de int.MaxValue)