-1 * int.MinValue == int.MinValue ??Это ошибка? - PullRequest
46 голосов
/ 02 сентября 2010

В C # я вижу, что

-1 * int.MinValue == int.MinValue

Это ошибка?Это действительно испортило меня, когда я пытался реализовать дерево поиска.В итоге я использовал (int.MinValue + 1), чтобы правильно отрицать его.

Ответы [ 5 ]

57 голосов
/ 02 сентября 2010

Это не ошибка.

int.MinValue * -1 на 1 больше, чем int.MaxValue. Таким образом, число возвращается к int.MinValue.

Это в основном вызвано целочисленным переполнением.

Int32.MinValue:

Значение этой константы -2,147,483,648

Int32.MaxValue:

Значение этой константы 2,147,483,647

Итак, -2,147,483,648 * -1 = 2,147,483,648, что на 1 больше Int32.MaxValue.

9 голосов
/ 02 сентября 2010

Это не ошибка, это переполнение.

В дополнении до двух представление пространства представимых чисел не симметрично.Противоположность наименьшего целого числа не может быть представлена.Вычисление этого переполняется и дает вам тот же номер снова.

8 голосов
/ 02 сентября 2010
int i = -1 * int.MinValue;

Это даже не скомпилируется, если вы не отключите проверку:

error CS0220: The operation overflows at compile time in checked mode
2 голосов
/ 06 ноября 2010

Поместите отмеченный регион в него и увидите, что «ошибка» превращается в исключение. Или попробуйте VB.NET (который, насколько я помню, по умолчанию проверяется в отличие от C #).

2 голосов
/ 02 сентября 2010

Нет, это не ошибка. Это природа двойного дополнения целочисленной арифметики.

Например, давайте возьмем значение байта со знаком, которое находится между -128 и 127.

127(0x7f)+1 = 128(0x80). Однако 0x80 на самом деле является двоичным представлением -128.

Таким образом, для байта, 128(0x80) = -128(0x80)

Итак -128(0x80) * -1 = 128(0x80) = -128(0x80)

...