-1 * int.minvalue == int.minvalue ?? Это ошибка?
-
26-09-2019 - |
Вопрос
В C # я вижу, что
-1 * int.MinValue == int.MinValue
Это ошибка? Это действительно приверило меня, когда я пытался реализовать дерево поиска. Я закончил использовать (int.MinValue + 1)
Так что я мог правильно отрицать это.
Решение
Это не ошибка.
int.MinValue * -1
является 1
лучше чем int.MaxValue
может держать. Таким образом, номер обертывается обратно к int.MinValue
.
Это в основном вызвано целочисленным переполнением.
Значение этой константы
-2,147,483,648
Значение этой константы
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 #).