Converti un numero positivo in negativo in C #


142

Puoi convertire un numero negativo in positivo in questo modo:

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

Esiste un metodo equivalente per rendere negativo un numero positivo?



3
280Z28: equivale a myInt = -1.
— ricorsivo il

1
deve essere myInt | = int.MinValue;
— Charles Bretana,

@ 280Z28: Funziona solo con numeri dispari, altrimenti equivale a rendere il numero negativo e quindi a sottrarre 1.
— Cecil ha un nome il

3
Per chiarezza del codice, non penso che dovresti usare System.Math.Abs ​​() se vuoi semplicemente "convertire un numero negativo in positivo". Matematicamente, non è questo il valore assoluto, anche se ottieni il risultato desiderato. A seconda del contesto algoritmico, dovresti usare la soluzione che hai accettato di seguito per passare anche da negativo a positivo.
— Chris Dwyer,

Risposte:


452

Che ne dite di

myInt = myInt * -1


55
Questa soluzione è eccezionale perché può anche convertire da negativo a positivo! Genio!
— Will Eddins,

19
Avevo l'impressione che potevi semplicemente attaccare un "-" di fronte a qualsiasi cosa per negarlo ... -myInt Questo sarebbe il negativo del valore in myInt ... -ABS (myInt) sarebbe un negativo garaunte.
— DataDink,

12
che dire myInt = - Myint?
— Kokbira,

9
o anche più breve myInt *= - 1?
— nawfal,

Cordiali saluti, se provi il metodo di kokbira con un corto, il myShort = (short) -myShortcast è necessario perché il corto diventa int quando viene negato.
— AaronLS il

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

29
+1 per ricordare che se fosse già un negativo avresti l'effetto opposto. La tua risposta è l'unica che darebbe sempre un numero negativo indipendentemente dal fatto che myNumber sia positivo o negativo.
— David,

Solo 26 voti per questa risposta? Ci sono utenti SO che pensano che non funzionerebbe?
— MusiGenesis,

6
30 voti positivi? La domanda è già così semplice. E questa risposta troppo complicata (farebbe anche -System.Math.Abs ​​(myNumber)) ottiene 30 voti in più ????
— mmmmmmmm,

4
@rstevens tutti cercano in modo collaborativo di indicare che questa risposta è molto più corretta di quella accettata. Inoltre, - vs * -1 non è sicuramente "troppo complicato".
— Rex M,

4
Mi piace questa risposta meglio di -System.Math.Abs ​​uno, dal momento che è un po 'più ovvio a prima vista cosa sta succedendo ... Penso che sarebbe leggermente più facile perdere il "-" di fronte alla dichiarazione.
— Beska,

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

11
Sì, perché la negazione è l'obiettivo, quindi un meno unario è l'operatore giusto. D'altra parte, moltiplicare per uno negativo è solo un trucco per negare un valore.
— Steven Sudit,

38
È un trucco perché conta su un effetto collaterale, non sull'effetto primario. L'effetto principale del meno unario è negare. L'effetto principale della moltiplicazione è la moltiplicazione. Accade solo che la moltiplicazione per -1 annulla. È più chiaro?
— Steven Sudit,

5
@StevenSudit No, non migliore di * -1. Moltiplicare per -1 non è "un trucco", è il modo matematico di trasformare un numero negativo. -Number è solo una scorciatoia di -1 * Numero. Inoltre, l'utilizzo di Abs per mantenere il numero negativo è eccessivo. myInt<0 ? myInt : -myInt;è molto meglio. Solo perché l'operatore - viene fornito come una scorciatoia per il numero -1 * corretto più le capacità di sovraccarico, non rende * (-1) un trucco.
— ThunderGr

93

Allo stesso modo in cui rendi qualsiasi altra cosa negativa: metti un segno negativo davanti.

var positive = 6;
var negative = -positive;

8
Tutti dimenticano il meno unario.
— ricorsivo il

Qual è la differenza pratica tra questa e questa risposta: stackoverflow.com/questions/1348080/… int myNegInt = System.Math.Abs(myNumber) * (-1);
— goodguys_activate

@ makerofthings7, quello a cui ti sei collegato sono molte più istruzioni della CPU - un'operazione a valore assoluto (almeno tre istruzioni su x86), seguita da un MUL (o eventualmente da un NEG se il compilatore è intelligente). Questa risposta è un singolo codice operativo NEG leggero, niente di più o di meno di quello che ti serve. Naturalmente, le due risposte si comportano diversamente quando il numero di input è già negativo; se (diversamente da questa domanda) il tuo contributo potrebbe essere negativo, questo prenderà la decisione per te.
— Joe White,

41

Nota a tutti coloro che hanno risposto

- Math.Abs(myInteger)

o

0 - Math.Abs(myInteger)

o

Math.Abs(myInteger) * -1

come un modo per mantenere negativi i numeri negativi e negativi quelli negativi.

Questo approccio ha un unico difetto. Non funziona per tutti i numeri interi. L'intervallo del Int32tipo è compreso tra "-2 31 " e "2 31 - 1." Significa che c'è un altro numero "negativo". Di conseguenza, Math.Abs(int.MinValue)genera un OverflowException.

Il modo corretto è utilizzare le istruzioni condizionali:

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

Questo approccio funziona per "tutti" numeri interi.


Ti darò il punto per la correttezza, ma qualsiasi codice che non dipende da nessuno che prende Abs di MinValue è fragile.
— Steven Sudit,

Steven: A volte, stai risolvendo un problema (come Abs) per cui non è possibile funzionare int.MinValue(supponendo il inttipo restituito). In tal caso, è del tutto OK generare un'eccezione. Tuttavia, questo problema specifico ha un risultato "valido" per int.MinValuema genera un'eccezione se si prende il Abspercorso.
— Mehrdad Afshari,

Dopo aver detto che la scala negativa è più grande di quella positiva, vai a suggerire il codice che non tiene conto di ciò. Se nè -32768allora -nè ANCHE -32768!!! Inoltre, int neg = n < 0 ? n : -n;non può assolutamente funzionare in tutti i casi, poiché uno dei ternari non fa assolutamente nulla.
— Clive Galway,

20

Il modo semplice:

myInt *= -1;

1
Stava per pubblicare lo stesso, tutti dovrebbero mostrare il * = some love :-)
— Brian Scott

16
int negInt = 0 - myInt;

O garantito per essere negativo.

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

11

Per cambiare il segno di un numero intero, basta usare l'operatore segno:

myInt = -myInt;

Per renderlo negativo indipendentemente dal fatto che il valore originale sia negativo o meno, devi prima utilizzare il metodo Abs:

myInt = -Math.Abs(myInt);

6

Solo per più divertimento:

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
Troppo rischioso, IMHO. Cosa succede se la definizione di un cerchio cambia?
— MusiGenesis,

6

EDIT: Questo è sbagliato per gli input positivi ... Ho fatto l'errore di dimenticare che il resto dei bit in -x (valore del complemento 2s) è "opposto" al loro valore in + x, non è lo stesso. Quindi, semplicemente cambiando il bit di segno NON funzionerà per numeri positivi.

Lascio questo qui per dentro per scopi ...

O il modo complicato (penso) ...

int y = x | ~ Int.MaxValue;

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

così

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

e quindi qualsiasi int32 Or'ed con quello metterà un 1 nel bit del segno, (rendendolo negativo), e lascerà tutti gli altri bit uguali ...

EDIT: in realtà, poiché 1000 0000 0000 0000 0000 0000 0000 0000 è in realtà il valore minimo, questo dovrebbe funzionare anche:

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

Quindi, lo zero negativo è uguale a int.MinValue?
— ricorsivo il

No, nel complemento a due, non c'è zero negativo. tutti quelli sono negativi 1. Un Int 8
— bit

1
+1 perché nessuno merita di essere retrocesso per aver risposto a una domanda del tipo "quale lettera viene dopo A ma prima di C?"
— MusiGenesis,

... e, grazie alla risposta di @ Mehrad di seguito, questo è l'unico approccio che funziona quando l'input è int.MinValue ...
— Charles Bretana,

Charles: Questo è sbagliato. Per i numeri negativi, funziona ma per i numeri positivi, non è sufficiente girare il bit del segno -number. 1è tutto zeri e uno. Se lo int.MinValue-1
— ordini con, otterrai

6

Anche se sono in ritardo alla festa qui, vado avanti con alcuni trucchi utili dai miei giorni hardware. Tutti questi assumono la rappresentazione complimento di 2 per i numeri firmati.

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

Vuoi spiegarlo di più? con i == int.MinValue, quindi tutte le variabili sono-2147483648
— Clive Galway,

5

Solo per divertimento:

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

Aggiornamento : il bello di questo approccio è che puoi facilmente trasformarlo in un generatore di eccezioni:

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

5

Io uso myInt = -myInt;

Così semplice e facile

Se vuoi avere solo positivi

myInt = myInt>0 ? myInt : -myInt;

Stavo cercando questa risposta in una situazione leggermente diversa dall'OP. Voglio che 2 valori si annullino a vicenda se uno di essi è -5, l'altro dovrebbe essere 5, quindi questa è la mia soluzione migliore = D
— Mathieu Brouwers,

otterresti un overflow poiché lo int.MaxValueè 2147483647, anche var i = int.MaxValue; i++;non funzionerà
— CMS

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

Nessuno ha detto che doveva essere un numero negativo particolare .


Ehm, se non ti interessa che debba essere un numero negativo particolare , potresti semplificarlo in "long negativeNumber = -1;"
— Beska,

@Guffa: questa è la battuta qui, in realtà.
— MusiGenesis,




0

Conversione di un numero da positivo a negativo o negativo a positivo:

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

0

Solo qualcosa che voglio condividere.

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

1
number >= 0 == isPositive ? number : -number
— Vitaliy

0

Come accennato in precedenza, moltiplicare solo per -1 non è interessante, come int.MinValue * -1 == int.MinValue

Dipende molto dalla tua applicazione, ma per i miei (invertire gli assi del joystick) voglio assicurarmi che tutti gli estremi siano ancora raggiungibili e mantenere la massima fedeltà possibile.
A tal fine, * -1
eseguo il mapping di Max <--> Min e tutto ciò che sta nel mezzo ottiene un Utilizzando questa tecnica, -32767 è irraggiungibile quando si inverte.

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


Invertion to 5 non lo è -5, ma 1/5.
— Dafie,

-2

Utilizzare binario e per rimuovere l'ultimo bit responsabile del segno negativo.

Oppure usa binario o per aggiungere un segno a un tipo di dati.

Questo soln può sembrare assurdo e incompleto, ma posso garantire che questo è il metodo più veloce.

Se non fai esperimenti con quello che ho pubblicato questo post può sembrare una schifezza: D

Ad esempio per int:

Int è un tipo di dati a 32 bit, quindi l'ultimo bit (32 °) determina il segno.

E con un valore che ha 0 al posto di 32 e riposo 1. Converte no negativo in + ve.

Per il contrario o con un valore con 1 al 32 ° posto e resto 0.


-3

X=*-1potrebbe non funzionare su tutti i compilatori ... poiché legge un "moltiplicare" "SOTTRATTO" 1 anziché NEGATIVO Il migliore alt è X=(0-X), [CHE È DIFFEROSO X-=X]

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.