2009-08-28 30 views
115

È possibile convertire un numero negativo a positivo in questo modo:Convertire un numero positivo a negativo in C#

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

Esiste un metodo equivalente per fare un numero positivo negativo?

+0

'myInt | = -1;' lol –

+0

http://en.wikipedia.org/wiki/Additive_inverse –

+3

280Z28: Questo è equivalente a mioInt = -1. – recursive

risposta

356

Come su

myInt = myInt * -1 

+0

Buona soluzione. :) –

+3

Grazie, dovrei sapere, è venerdì pomeriggio per te ... zzzz –

+37

Questa soluzione è ottima perché può anche convertire il negativo in positivo! Genio! –

17
int negInt = 0 - myInt; 

O garantito come negativo.

int negInt = -System.Math.Abs(someInt); 
199
int myNegInt = System.Math.Abs(myNumber) * (-1); 
+23

+1 per ricordare che se è 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

+0

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

+4

30 voti in su? Già la domanda è così semplice. E questa risposta troppo complicata (-System.Math.Abs ​​(myNumber) farebbe anche) ottiene 30 voti in più ???? – mmmmmmmm

19

Il modo più semplice:

myInt *= -1; 
+0

Stava per pubblicare lo stesso, tutti dovrebbero mostrare * = un po 'di amore :-) –

3

moltiplicarlo per -1.

119
int negInt = -System.Math.Abs(myInt) 
+4

Più bello di "* -1". –

+11

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

+2

Un trucco? Chi stai prendendo in giro? – Shog9

84

Nello stesso modo in cui si fa qualcos'altro di negativo: mettere un segno negativo di fronte ad esso.

var positive = 6; 
var negative = -positive; 
+7

Tutti dimenticano il meno unario. – recursive

+1

+1 .. bastonatemi. – Inisheer

+9

Questa dovrebbe essere la risposta accettata. –

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

EDIT: Questo è sbagliato per gli ingressi positivo ... feci errore di dimenticare che il resto dei bit -x (valore 2s-complemento) sono il 'opposto' del valore d' + x, non lo stesso. COSÌ semplicemente cambiando il bit del segno NON funzionerà per numeri positivi.

Lascio questo qui per a per scopi ...

O il modo ingannevole (credo) ...

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 ogni int32 OR ad che metterà un 1 nel bit di segno, (rendendolo negativo), e lasciare tutti gli altri bit uguali ...

EDIT: in realtà, dato che il 1000 0000 0000 0000 0000 0000 0000 0000 è in realtà il MinValue, questo dovrebbe funzionare anche:

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

Quindi, zero negativo è uguale a int.MinValue? – recursive

+0

No, nel complemento a due, non c'è zero negativo. tutti sono negativi 1. A Signed 8Bit Int: 10000000 è -128 –

+1

+1 perché nessuno merita di essere downvoted per rispondere a una domanda del tipo "quale lettera viene dopo A ma prima di C?" – MusiGenesis

11

Per passare il segno di un numero intero, è sufficiente utilizzare l'operatore segno :

myInt = -myInt; 

Per rendere più negativo a prescindere se il valore originale è negativo o no, per la prima volta utilizza il metodo Abs:

myInt = -Math.Abs(myInt); 
6

Solo per divertimento:

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

Aggiornamento: la bellezza di questo approccio è che si può facilmente refactoring in un generatore di eccezione:

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

Vostro diritto: è più facile chiedere che pensare, ecco perché appaiono domande come questa. Ma il vero problema è che ci sono persone che ricevono molta reputazione rispondendo a domande come questa. Dall'altra parte ci sono persone che si rompono il cervello per risolvere problemi reali e ricevere solo un voto perché nessuno può capire cosa stanno risolvendo. Interessante no? – backslash17

+2

@ backslash17: sono totalmente d'accordo. Ci sono molti molti esempi di questo fenomeno su StackOverflow, ma questa domanda è sicuramente la più ridicola di tutte. Voglio dire, "come si fa a rendere un numero positivo negativo?", E le persone in realtà stanno discutendo su questo? Sei serio? – MusiGenesis

+0

@ backslash17 - Sì! –

4

Forse questo?

int n; 

.... some coding.... 

n = n<=0? n:0-n; 
+0

la migliore soluzione – kokbira

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

Nessuno ha detto che doveva essere qualsiasi particolare numero negativo .

+0

Um, se non ti interessa che debba essere un numero negativo * particolare *, puoi semplificarlo a "long negativeNumber = -1;" – Beska

+0

Eh, basta renderlo un byte. :) – MusiGenesis

+0

Un byte non può essere negativo ... – Guffa

6

Solo per più divertente:

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

+1

OK, come va su Math.Sin (-Math.Pi/2) * ... –

37

nota a tutti coloro che ha risposto con

- Math.Abs(myInteger) 

o

0 - Math.Abs(myInteger) 

o

Math.Abs(myInteger) * -1 

come modo per mantenere negativi i numeri negativi e trasformare quelli positivi in ​​negativo.

Questo approccio ha un solo difetto. Non funziona per tutti gli interi. L'intervallo del tipo Int32 è da "-2 " a "2 - 1." Significa che c'è un altro numero "negativo". Di conseguenza, Math.Abs(int.MinValue) genera uno OverflowException.

Il modo corretto è quello di utilizzare le istruzioni condizionali:

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

questo approccio funziona per "tutti" i numeri interi.

+0

Ti lancerò il punto per la correttezza, ma qualsiasi codice che dipende da nessuno che prenda Abs di MinValue è fragile. –

+0

Steven: A volte, stai risolvendo un problema (come 'Abs') che non può funzionare per' int.MinValue' (assumendo il tipo di ritorno 'int'.) In tal caso, è completamente OK lanciare un'eccezione. Tuttavia, questo problema specifico ha un risultato "valido" per 'int.MinValue' ma genera un'eccezione se si prende la route' Abs'. –

+0

ma x | = int.MinValue funziona per tutti gli interi, incluso MinValue ... –

4

Anche se sono molto in ritardo per la festa qui, ho intenzione di suonare con alcuni trucchi utili dai miei giorni di hardware. Tutti questi presuppongono la rappresentazione di complimenti di 2 per i numeri firmati.

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

X=*-1 potrebbe non funzionare su tutti i compilatori ...dal momento che legge un 'moltiplicare' 'SOTTRAI' 1 al posto di NEGATIVO Il meglio alt è X=(0-X), [che è DIFF DAL X-=X]

+1

... intendi X * = - 1? – kokbira

-2

Usa binario e per rimuovere l'ultimo pezzo che è responsabile per il segno negativo.

Oppure utilizzare binario o aggiungere un segno a un tipo di dati.

Questa solf potrebbe sembrare assurda e incompleta, ma posso garantire che questo è il metodo più veloce.

Se non sperimentare con quello che ho scritto questo post può sembrare schifo: D

Ad esempio per int:

int è 32 bit tipo di dati così l'ultimo bit (32 ° uno) determina il segno .

E con un valore che ha 0 nel posto 32 e si riposa 1. Converte il no negativo in + ve.

Per tutto il contrario o con un valore di 1 al posto 32 ° e riposare 0.

0

Il modo più semplice a = -a farà il favore

3

Io uso myInt = -myInt;

Così

semplice e facile

Se si vuole avere solo positiva

myInt = myInt>0 ? myInt : -myInt; 
+0

Stavo cercando questa risposta in una situazione leggermente diversa come l'OP. Voglio avere 2 valori negati a vicenda se uno di questi è -5 l'altro dovrebbe essere 5, quindi questa è la mia soluzione migliore = D –

0

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

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