Możesz przekonwertować liczbę ujemną na dodatnią w następujący sposób:
int myInt = System.Math.Abs(-5);
Czy istnieje równoważna metoda zmiany liczby dodatniej na ujemną?
Możesz przekonwertować liczbę ujemną na dodatnią w następujący sposób:
int myInt = System.Math.Abs(-5);
Czy istnieje równoważna metoda zmiany liczby dodatniej na ujemną?
Odpowiedzi:
Co powiesz na
myInt = myInt * -1
myInt = - Myint?
myInt *= - 1?
myShort = (short) -myShortrzut jest konieczny, ponieważ krótka staje się int, gdy jest zanegowana.
int myNegInt = System.Math.Abs(myNumber) * (-1);
int negInt = -System.Math.Abs(myInt)
myInt<0 ? myInt : -myInt;jest znacznie lepsza. Tylko dlatego, że operator - jest podany jako skrót dla właściwej liczby -1 * plus możliwości przeciążania, nie czyni * (-1) sztuczką.
W ten sam sposób, w jaki robisz wszystko inne jako ujemne: umieść przed nim znak minus.
var positive = 6;
var negative = -positive;
int myNegInt = System.Math.Abs(myNumber) * (-1);
Uwaga dla wszystkich, którzy odpowiedzieli
- Math.Abs(myInteger)
lub
0 - Math.Abs(myInteger)
lub
Math.Abs(myInteger) * -1
jako sposób na zachowanie ujemnych liczb i zmienianie dodatnich na ujemne.
To podejście ma jedną wadę. Nie działa dla wszystkich liczb całkowitych. Zakres Int32typów wynosi od „-2 31 ” do „2 31 - 1”. Oznacza to, że jest jeszcze jedna liczba „ujemna”. W konsekwencji Math.Abs(int.MinValue)rzuca plik OverflowException.
Prawidłowym sposobem jest użycie instrukcji warunkowych:
int neg = n < 0 ? n : -n;
To podejście działa dla „wszystkich” liczb całkowitych.
Abs), na który prawdopodobnie nie można zadziałać int.MinValue(zakładając inttyp zwrotu). W takim przypadku rzucenie wyjątku jest całkowicie OK. Jednak ten konkretny problem ma „prawidłowy” wynik dla, int.MinValueale zgłasza wyjątek, jeśli wybierzesz Abstrasę.
nto -32768wtedy -njest też -32768!!! Co więcej, int neg = n < 0 ? n : -n;prawdopodobnie nie może działać we wszystkich przypadkach, ponieważ jedna z trójskładników absolutnie nic nie robi.
Łatwa droga:
myInt *= -1;
Dla większej zabawy:
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);
EDYCJA: To jest złe dla dodatnich wejść ... Popełniłem błąd zapominając, że pozostałe bity w -x (2s-wartość dopełnienia) są „przeciwieństwem” ich wartości w + x, a nie to samo. WIĘC prosta zmiana bitu znaku NIE zadziała dla liczb dodatnich.
Zostawię to tutaj do celów ...
Lub podstępny sposób (myślę) ...
int y = x | ~ int.MaxValue;
cause int.MaxValue is 0111 1111 1111 1111 1111 1111 1111 1111
więc
~int.MaxValue is 1000 0000 0000 0000 0000 0000 0000 0000
i dlatego każdy int32 Or'ed z tym umieści 1 w bicie znaku (czyniąc go ujemnym) i pozostawi wszystkie inne bity takie same ...
EDYCJA: faktycznie, ponieważ 1000 0000 0000 0000 0000 0000 0000 0000 jest w rzeczywistości wartością minimalną, powinno to również działać:
int y = x | int.MinValue; // or, to do it to itself,
x |= int.MinValue;
-number. 1to same zera i jedynka. Or int.MinValue-1
Mimo, że na imprezę się tutaj spóźniłem, zamierzam dodać kilka przydatnych sztuczek z czasów, kiedy byłem sprzętem. Wszystkie te zakładają reprezentację komplementu 2 dla liczb ze znakiem.
int negate = ~i+1;
int positiveMagnitude = (i ^ (i>>31)) - (i>>31);
int negativeMagnitude = (i>>31) - (i ^ (i>>31));
i == int.MinValue, to wszystkie zmienne to-2147483648
Dla żartu:
int negativeInt = int.Parse(String.Format("{0}{1}",
"-", positiveInt.ToString()));
Aktualizacja : piękno tego podejścia polega na tym, że można go łatwo zmienić w generator wyjątków:
int negativeInt = int.Parse(String.Format("{0}{1}",
"thisisthedumbestquestioninstackoverflowhistory", positiveInt.ToString()));
używam myInt = -myInt;
Tak proste i łatwe
Jeśli chcesz mieć tylko pozytywne
myInt = myInt>0 ? myInt : -myInt;
int.MaxValuejest 2147483647, nawet var i = int.MaxValue; i++;nie zadziała
long negativeNumber = (long)positiveInt - (long)(int.MaxValue + 1);
Nikt nie powiedział, że musi to być jakaś konkretna liczba ujemna.
Może to?
int n;
.... some coding....
n = n<=0? n:0-n;
Pomnóż to przez -1.
Jak wspomniano wcześniej, zwykłe pomnożenie przez -1 nie jest fajne, ponieważ int.MinValue * -1 == int.MinValue
To naprawdę zależy od twojej aplikacji, ale dla mojej (odwracanie osi joysticka) chcę mieć pewność, że wszystkie skrajności są nadal osiągalne i zachować jak największą wierność.
W tym celu * -1
mapuję Max <--> Min i wszystko pomiędzy dostaje a Używając tej techniki, -32767 jest nieosiągalne podczas odwracania.
private static int Invert(int value)
{
if (value == int.MaxValue) return int.MinValue;
if (value == int.MinValue) return int.MaxValue;
return value * -1;
}
5nie jest -5, ale 1/5.
Użyj binarnego i usuń ostatni bit odpowiedzialny za znak ujemny.
Lub użyj binarnego lub, aby dodać znak do typu danych.
To rozwiązanie może brzmieć absurdalnie i niekompletnie, ale gwarantuję, że to najszybsza metoda.
Jeśli nie eksperymentujesz z tym, co zamieściłem, ten post może wyglądać fatalnie: D
Np. Dla int:
Int jest 32-bitowym typem danych, więc ostatni bit (32-ty) określa znak.
I z wartością, która ma 0 na 32 miejscu, a reszta 1. Przekształci ujemne nie na + ve.
Wręcz przeciwnie lub z wartością 1 na 32 miejscu i resztą 0.
X=*-1może nie działać na wszystkich kompilatorach ... ponieważ czyta „pomnóż” „ODEJMOWANIE” 1 zamiast NEGATYWNY Im lepszy alt jest X=(0-X), [KTÓRY JEST RÓŻNY OD X-=X]