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.