Вопрос

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

-1 * int.MinValue == int.MinValue

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

Это было полезно?

Решение

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

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.

Другие советы

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

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

int i = -1 * int.MinValue;

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

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

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

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

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

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

Так -128(0x80) * -1 = 128(0x80) = -128(0x80)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top