Перетворити позитивне число в негативне в 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
Це рішення чудове, тому що воно також може перетворити негатив у позитив! Геній!
— Вілл Еддінс

19
У мене було враження, що ви можете просто покласти "-" перед чим-небудь, щоб його заперечувати ... -myInt Це буде негативним значенням у моєму ... -ABS (myInt) було б гарантійним негативом.
— DataDink

12
про що myInt = - Myint?
— кокбіра

9
чи навіть коротше myInt *= - 1?
— nawfal

FYI, якщо ви спробуєте метод kokbira з коротким, myShort = (short) -myShortкастинг необхідний, тому що короткий стає int, коли його заперечують.
— AaronLS

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

29
+1 за те, що пам’ятаєте, що якщо це вже негатив, ви матимете зворотний ефект. Ваша відповідь є єдиною, яка завжди давала б негативне число незалежно від того, чи є мій номер позитивним чи негативним.
— Девід

Лише 26 голосів за цю відповідь? Чи є користувачі SO, які думають, що це не працює?
— MusiGenesis

6
30 голосів "за"? Вже питання таке просте. І ця надмірно складна відповідь (-System.Math.Abs ​​(мій номер) також зробить) набирає 30 голосів ????
— ммммммммм

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

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

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

11
Так, оскільки заперечення - мета, тому одинарний мінус - правильний оператор. З іншого боку, множення на негатив - лише хитрість заперечувати значення.
— Стівен Судіт

38
Це хитрість, оскільки він розраховує на побічний ефект, а не на первинний ефект. Основний ефект одинарного мінусу - це заперечення. Основний ефект множення - це множення. Так буває, що множення на -1 заперечує. Це зрозуміліше?
— Стівен Судіт

5
@StevenSudit Ні, не приємніше * -1. Помноження на -1 не є "хитрістю", це математичний спосіб повернути число від'ємником. -Кількість - це лише скорочення 1 * номер. Крім того, використання Abs для збереження від’ємного числа є надлишком. myInt<0 ? myInt : -myInt;набагато краще. Тільки тому, що оператор - надається як скорочення для належного -1 * номера плюс можливості перевантаження, не робить * (-1) хитрістю.
— Грім

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;можливо, це не може працювати у всіх випадках, оскільки один з тернарів абсолютно нічого не робить.
— Клайв Голвей


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

EDIT: Це неправильно для позитивних входів ... Я помилився, забувши, що решта бітів у -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 у бітовий знак (роблячи це негативним), а всі інші біти залишать однаковими ...

EDIT: насправді, оскільки 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. A Підписано 8Bit Int: 10000000 - -128
— Charles Bretana

1
+1, тому що ніхто не заслуговує на те, щоб відповісти на запитання на кшталт "який лист надходить після А, але перед С?"
— MusiGenesis

... і, завдяки відповіді @ Меграда нижче, Це єдиний підхід, який працює, коли вхід є 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 negativeNumber = -1;"
— Беска

@Guffa: насправді тут жарт.
— 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.
— dafie

-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.