47 votes

-1 * int.MinValue == int.MinValue ?? Est-ce un bug?

En C # je vois que

 -1 * int.MinValue == int.MinValue
 

Est-ce un bug? Cela m'a vraiment fait foirer lorsque j'essayais de mettre en place un arbre de recherche. J'ai fini par utiliser (int.MinValue + 1) afin de pouvoir l'annuler correctement.

58voto

jjnguy Points 62123

Ce n'est pas un bug.

int.MinValue * -1 est 1 de plus de int.MaxValue peut contenir. Ainsi, le nombre s'enroule autour de l'arrière à l' int.MinValue.

C'est essentiellement causée par un débordement d'entier.

Int32.MinValue:

La valeur de cette constante est - -2,147,483,648

Int32.MaxValue:

La valeur de cette constante est - 2,147,483,647

Donc, -2,147,483,648 * -1 = 2,147,483,648 qui 1 de plus de Int32.MaxValue.

9voto

Pascal Cuoq Points 39606

Ce n'est pas un bug, c'est un débordement.

Dans la représentation du complément à deux , l'espace des nombres représentables n'est pas symétrique. Le contraire du plus petit entier ne peut pas être représenté. Le calcul le déborde et vous redonne le même numéro.

8voto

Darin Dimitrov Points 528142
 int i = -1 * int.MinValue;
 

Cela ne compile même pas sauf si vous désactivez la vérification:

 error CS0220: The operation overflows at compile time in checked mode
 

2voto

Torlack Points 2910

Non, ce n'est pas un bug. C’est la nature de l’arithmétique des nombres complémentaires du complément à deux.

Par exemple, prenons une valeur d'octet signé qui se situe entre -128 et 127 .

127(0x7f)+1 = 128(0x80) . Cependant, 0x80 est en fait la représentation binaire de -128 .

Ainsi, pour un octet, 128(0x80) = -128(0x80)

Donc -128(0x80) * -1 = 128(0x80) = -128(0x80)

2voto

Andrei Rînea Points 7554

Mettez une région cochée dessus et voyez le "bogue" évoluer vers une exception. Ou essayez VB.NET (qui, si je me souviens bien, est coché par défaut, contrairement à C #).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X