В С# я вижу, что
-1 * int.MinValue == int.MinValue
Это ошибка? Это действительно привинчило меня, когда я пытался внедрить дерево поиска. Я закончил тем, что использовал (int.MinValue + 1)
, чтобы я мог правильно отменить его.
В С# я вижу, что
-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)
So -128(0x80) * -1 = 128(0x80) = -128(0x80)
Поместите на него отмеченную область и увидите, что "ошибка" превращается в исключение. Или попробуйте VB.NET(который, насколько я помню, проверен по умолчанию в отличие от С#).