Перетворити позитивне число в негативне в 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.