Преобразовать положительное число в отрицательное в C #


142

Вы можете преобразовать отрицательное число в положительное, например так:

int myInt = System.Math.Abs(-5);

Есть ли эквивалентный способ сделать положительное число отрицательным?



3
280Z28: Это эквивалентно myInt = -1.
— рекурсивный

1
должен быть myInt | = int.MinValue;
— Чарльз Бретана

@ 280Z28: Это работает только для нечетных чисел, в противном случае это то же самое, что сделать отрицательное число, а затем вычесть 1.
— Сесил имеет имя

3
Для ясности кода я не думаю, что вам следует использовать System.Math.Abs ​​(), если вы хотите просто «преобразовать отрицательное число в положительное». Математически это не абсолютное значение, даже если вы получите желаемый результат. В зависимости от вашего алгоритмического контекста, вы должны использовать решение, принятое ниже, для перехода от отрицательного к положительному.
— Крис Дуайер

Ответы:


452

Как насчет

myInt = myInt * -1


55
Это отличное решение, потому что оно также может конвертировать негатив в позитив! Genius!
— Уилл Эддинс

19
У меня сложилось впечатление, что вы можете просто вставить "-" перед чем-либо, чтобы отрицать это ... -myInt Это будет отрицательным значением в myInt ... -ABS (myInt) будет гарантированным отрицательным значением.
— DataDink,

12
о чем myInt = - Myint?
— Кокбира

9
или еще короче myInt *= - 1?
— Nawfal

К вашему сведению, если вы попробуете метод Кокбира с коротким, то myShort = (short) -myShortприведение необходимо, потому что короткое становится отрицательным.
— AaronLS

236
int myNegInt = System.Math.Abs(myNumber) * (-1);

29
+1 за то, что вы помните, что если это уже минус, вы получите противоположный эффект. Ваш ответ является единственным, который всегда будет давать отрицательное число независимо от того, положительный или отрицательный myNumber.
— Дэвид

Только 26 голосов за этот ответ? Есть ли ТАК пользователи, которые думают, что это не сработает?
— MusiGenesis

6
30 голосов? Уже вопрос так прост. И этот слишком сложный ответ (-System.Math.Abs ​​(myNumber) также подойдет) получает 30 голосов до ????
— мммммммм

4
@rstevens каждый, кто совместно пытается указать, что этот ответ гораздо более правильный, чем принятый. Кроме того, - vs * -1 определенно не "слишком сложный".
— Рекс М

4
Мне нравится этот ответ лучше, чем ответ -System.Math.Abs, так как с первого взгляда все более очевидно, что происходит ... Я думаю, что было бы немного легче пропустить знак "-" перед утверждением.
— Беска

132
int negInt = -System.Math.Abs(myInt)

11
Да, потому что отрицание является целью, поэтому унарный минус является правильным оператором. С другой стороны, умножение на отрицательное является просто уловкой для отрицания значения.
— Стивен Судит

38
Это трюк, потому что он рассчитывает на побочный эффект, а не основной эффект. Основной эффект унарного минуса - отрицание. Основным эффектом умножения является умножение. Так уж получилось, что умножение на -1 сводит на нет. Это понятнее?
— Стивен Судит

5
@ StevenSudit Нет, не лучше, чем * -1. Умножение на -1 - не «хитрость», это математический способ превратить число в отрицательное. -Number это просто сокращение от -1 * Number. Кроме того, использование Abs для сохранения отрицательного числа является излишним. myInt<0 ? myInt : -myInt;гораздо лучше. Тот факт, что оператор - предоставлен как сокращение для правильного числа -1 * плюс возможности перегрузки, не делает * (-1) уловкой.
— ThunderGr

93

Точно так же, как вы делаете все остальное отрицательным: поставьте перед ним отрицательный знак.

var positive = 6;
var negative = -positive;

8
Все забывают унарный минус.
— рекурсивный

В чем практическая разница между этим и этим ответом: stackoverflow.com/questions/1348080/… int myNegInt = System.Math.Abs(myNumber) * (-1);
— goodguys_activate

@ makerofthings7, с которой вы связались, гораздо больше инструкций ЦП - операция с абсолютным значением (как минимум три инструкции на x86), за которой следует MUL (или, возможно, NEG, если компилятор умный). Этот ответ представляет собой простой, легкий код операции NEG, ничего более или менее того, что вам нужно. Конечно, два ответа ведут себя по-разному, когда введенное число уже отрицательно; если (в отличие от этого вопроса) ваш вклад может быть отрицательным, это решение за вас.
— Джо Уайт

41

Примечание для всех, кто ответил

- Math.Abs(myInteger)

или

0 - Math.Abs(myInteger)

или

Math.Abs(myInteger) * -1

как способ сохранить отрицательные числа отрицательными и превратить положительные в отрицательные.

У этого подхода есть один недостаток. Это не работает для всех целых чисел. Диапазон Int32типа от «-2 31 » до «2 31 - 1». Это означает, что есть еще одно «отрицательное» число. Следовательно, Math.Abs(int.MinValue)выбрасывает OverflowException.

Правильный способ заключается в использовании условных операторов:

int neg = n < 0 ? n : -n;

Этот подход работает для "всех" целых чисел.


Я поделюсь с вами вопросом правильности, но любой код, который зависит от того, что никто не принимает Abs от MinValue, хрупок.
— Стивен Судит

Стивен: Иногда вы решаете проблему (например Abs), которая не может работать int.MinValue(при условии intвозвращаемого типа). В этом случае вполне нормально выдавать исключение. Тем не менее, эта конкретная проблема имеет «действительный» результат для, int.MinValueно выдает исключение, если вы берете Absмаршрут.
— Мердад Афшари

Сказав, что отрицательная шкала больше положительной, вы идете и предлагаете код, который не учитывает это. Если nесть, -32768то -nТАКЖЕ -32768!!! Кроме того, int neg = n < 0 ? n : -n;не может работать во всех случаях, так как одна из троичных не делает абсолютно ничего.
— Клайв Голуэй

20

Простой способ:

myInt *= -1;

1
Собирался опубликовать то же самое, все должны показать * = немного любви :-)
— Брайан Скотт

16
int negInt = 0 - myInt;

Или гарантированно будет отрицательным.

int negInt = -System.Math.Abs(someInt);

11

Чтобы переключить знак целого числа, вы просто используете оператор знака:

myInt = -myInt;

Чтобы сделать его отрицательным независимо от того, является ли исходное значение отрицательным или нет, вы сначала используете метод Abs:

myInt = -Math.Abs(myInt);

6

Просто для удовольствия:

int myInt = Math.Min(hisInt, -hisInt);

int myInt = -(int)Math.Sqrt(Math.Pow(Math.Sin(1), 2) + Math.Pow(Math.Cos(-1), 2))
            * Math.Abs(hisInt);

2
Слишком рискованно, ИМХО. Что если изменится определение круга?
— MusiGenesis

6

РЕДАКТИРОВАТЬ: Это неправильно для положительных входов ... Я сделал ошибку, забыв, что остальные биты в -x (значение 2s-Complement) являются «противоположными» их значения в + x, а не то же самое. Поэтому простое изменение знака не будет работать для положительных чисел.

Я оставлю это здесь для целей ...

Или хитрый способ (я думаю) ...

int y = x | ~ Int.MaxValue;

cause int.MaxValue is 0111 1111 1111 1111 1111 1111 1111 1111

так

~int.MaxValue is      1000 0000 0000 0000 0000 0000 0000 0000

и поэтому любой int32 Or'ed с этим установит 1 в бит знака (делая его отрицательным) и оставит все остальные биты такими же ...

РЕДАКТИРОВАТЬ: на самом деле, так как 1000 0000 0000 0000 0000 0000 0000 0000 на самом деле Minvalue, это также должно работать:

   int y = x | int.MinValue; // or, to do it to itself,
   x |= int.MinValue;

Итак, отрицательный ноль равен int.MinValue?
— рекурсивный

Нет, в дополнении двойки нет отрицательного нуля. все единицы отрицательны 1. Подписанный 8-битный Int: 10000000 - -128
— Чарльз Бретана

1
+1, потому что никто не заслуживает того, чтобы его голосовали за то, что он ответил на вопрос типа «какое письмо идет после А, но до С?»
— MusiGenesis

... и, благодаря ответу @ Mehrad ниже, это единственный подход, который работает, когда ввод int.MinValue ...
— Чарльз Бретана

Чарльз: Это неправильно. Для отрицательных чисел это работает, но для положительных чисел простое переключение знака не дает результата -number. 1это все нули и один. В противном случае int.MinValueполучится значение 10000000000000000000000000000001, которое не равно -1(всем).
— Мехрдад Афшари

6

Несмотря на то, что я опаздываю на вечеринку здесь, я собираюсь присоединиться к некоторым полезным трюкам из моих аппаратных дней. Все они предполагают 2 комплимента для подписанных номеров.

int negate = ~i+1;
int positiveMagnitude = (i ^ (i>>31)) - (i>>31);
int negativeMagnitude = (i>>31) - (i ^ (i>>31));

Хотите объяснить это больше? с i == int.MinValue, то все переменные-2147483648
— Клайв Голуэй

5

Просто для удовольствия:

int negativeInt = int.Parse(String.Format("{0}{1}", 
    "-", positiveInt.ToString()));

Обновление : прелесть этого подхода в том, что вы можете легко преобразовать его в генератор исключений:

int negativeInt = int.Parse(String.Format("{0}{1}", 
    "thisisthedumbestquestioninstackoverflowhistory", positiveInt.ToString()));

5

я использую myInt = -myInt;

Так просто и легко

Если хочешь иметь только позитив

myInt = myInt>0 ? myInt : -myInt;

Я искал этот ответ в несколько иной ситуации, как ОП. Я хочу, чтобы 2 значения отрицали друг друга, если одно из них равно -5, а другое должно быть 5, поэтому это мое лучшее решение = D
— Матье Брауэрс

вы получите переполнение, так как оно int.MaxValueесть 2147483647, даже не var i = int.MaxValue; i++;будет работать
— CMS

4
long negativeNumber = (long)positiveInt - (long)(int.MaxValue + 1);

Никто не сказал, что это должно быть какое-то конкретное отрицательное число.


Хм, если вас не волнует, что это должно быть конкретное отрицательное число, вы можете упростить это до "long absoluteNumber = -1;"
— Беска

@ Гуффа: это шутка здесь, на самом деле.
— MusiGenesis




0

Преобразование числа из положительного в отрицательное или из отрицательного в положительное:

public static decimal Reverse(this decimal source)
{
     return source * decimal.MinusOne;
}

0

Просто то, чем я хочу поделиться.

public decimal NumberReevaluate(decimal number, bool isPositive)
{
    var tempNumber = System.Math.Abs(number);
    return isPositive ? tempNumber : -tempNumber;
}

1
number >= 0 == isPositive ? number : -number
— Виталий

0

Как упоминалось ранее, просто умножить на -1 не круто, так как int.MinValue * -1 == int.MinValue

Это действительно зависит от вашего приложения, но для моего (инвертирование осей джойстика) я хочу убедиться, что все крайности все еще достижимы, и поддерживать как можно большую точность.
С этой целью я сопоставляю Max <-> Min, и все промежуточное значение получает * -1
Использование этой техники, -32767 недоступно при инвертировании.

private static int Invert(int value) { if (value == int.MaxValue) return int.MinValue; if (value == int.MinValue) return int.MaxValue; return value * -1; }


Инверсии в 5нет -5, но 1/5.
— Дафи

-2

Используйте двоичный файл и удалите последний бит, который отвечает за отрицательный знак.

Или используйте двоичный файл или добавьте знак к типу данных.

Это решение может показаться абсурдным и неполным, но я могу гарантировать, что это самый быстрый метод.

Если вы не экспериментируете с тем, что я опубликовал, этот пост может выглядеть чушью: D

Например, для int:

Int - это 32-битный тип данных, поэтому последний бит (32-й) определяет знак.

И со значением, которое имеет 0 в 32 месте и остальное 1. Это преобразует отрицательное нет в + ve.

Для противоположного или со значением с 1 на 32 месте и отдыха 0.


-3

X=*-1может работать не на всех компиляторах ... так как он читает 'SUBTRACT' 1 умножить вместо NEGATIVE. Чем лучше X=(0-X), тем [ЧТО ОТЛИЧАЕТСЯ ОТ X-=X]

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.