Ви можете перетворити від'ємне число в таке, як таке:
int myInt = System.Math.Abs(-5);
Чи існує еквівалентний спосіб зробити додатне число від'ємним?
Ви можете перетворити від'ємне число в таке, як таке:
int myInt = System.Math.Abs(-5);
Чи існує еквівалентний спосіб зробити додатне число від'ємним?
Відповіді:
Як щодо
myInt = myInt * -1
myInt = - Myint?
myInt *= - 1?
myShort = (short) -myShortкастинг необхідний, тому що короткий стає int, коли його заперечують.
int myNegInt = System.Math.Abs(myNumber) * (-1);
int negInt = -System.Math.Abs(myInt)
myInt<0 ? myInt : -myInt;набагато краще. Тільки тому, що оператор - надається як скорочення для належного -1 * номера плюс можливості перевантаження, не робить * (-1) хитрістю.
Так само, як ви робите що-небудь ще негативне: поставте перед ним негативний знак.
var positive = 6;
var negative = -positive;
int myNegInt = System.Math.Abs(myNumber) * (-1);
Зауважте всіх, хто відповів на
- 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), яка не може працювати int.MinValue(припускаючи intтип повернення.) У цьому випадку викинути виняток цілком нормально. Однак ця конкретна проблема має "дійсний" результат, int.MinValueале викидає виняток, якщо ви рухаєтесь по Absмаршруту.
nє , -32768то -nТАКОЖ -32768!!! Крім того, int neg = n < 0 ? n : -n;можливо, це не може працювати у всіх випадках, оскільки один з тернарів абсолютно нічого не робить.
Простий спосіб:
myInt *= -1;
Просто для більше задоволення:
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);
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;
-number. 1це всі нулі та одна. Інакше, це int.MinValueпризведе до 10000000000000000000000000000001, що не дорівнює -1(всі.)
Незважаючи на те, що я запізнююсь на вечірці тут, я збираюся задзвонювати деякі корисні хитрощі з моїх апаратних днів. Усі вони передбачають комплімент 2 для підписаних номерів.
int negate = ~i+1;
int positiveMagnitude = (i ^ (i>>31)) - (i>>31);
int negativeMagnitude = (i>>31) - (i ^ (i>>31));
i == int.MinValue, тоді всі змінні-2147483648
Задля розваги:
int negativeInt = int.Parse(String.Format("{0}{1}",
"-", positiveInt.ToString()));
Оновлення : краса цього підходу полягає в тому, що ви можете легко переробити його в генератор винятків:
int negativeInt = int.Parse(String.Format("{0}{1}",
"thisisthedumbestquestioninstackoverflowhistory", positiveInt.ToString()));
я використовую myInt = -myInt;
Так просто і легко
Якщо ви хочете мати лише позитив
myInt = myInt>0 ? myInt : -myInt;
int.MaxValueвже 2147483647навіть var i = int.MaxValue; i++;звичайна робота
long negativeNumber = (long)positiveInt - (long)(int.MaxValue + 1);
Ніхто не сказав , що це повинно було бути якийсь - або конкретний негативне число.
Може, це?
int n;
.... some coding....
n = n<=0? n:0-n;
int myInt = - System.Math.Abs(-5);
Помножте його на -1.
Як було сказано раніше, просто помножити на -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.
Використовуйте двійковий код і видаліть останній біт, який відповідає за негативний знак.
Або скористайтеся двійковим або для додавання знаку до типу даних.
Цей соль може здатися абсурдним і неповним, але я можу гарантувати, що це найшвидший метод.
Якщо ви не експериментуєте з тим, що я опублікував, цей пост може виглядати лайно: D
Напр. Для int:
Int - це 32-ти бітний тип даних, тому останній біт (32-й) визначає знак.
І зі значенням, яке має 0 на 32 місці та решта 1. Він перетворить мінус не в + ve.
Для прямо протилежного або зі значенням з 1 на 32-му місці, а відпочинок 0.
X=*-1може не працювати з усіма компіляторами ... оскільки він читає "множити" "SUBTRACT" 1 замість NEGATIVE. Кращий альт X=(0-X), [КОГО ВІДДІЛЕНО X-=X]