-1 * int.MinValue == int.MinValue?? Это ошибка? - программирование
Подтвердить что ты не робот

-1 * int.MinValue == int.MinValue?? Это ошибка?

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

-1 * int.MinValue == int.MinValue

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

4b9b3361

Ответ 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.

Ответ 2

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

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

Ответ 3

int i = -1 * int.MinValue;

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

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

Ответ 4

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

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

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

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

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

Ответ 5

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