Converta um número positivo em negativo em C #


142

Você pode converter um número negativo em positivo assim:

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

Existe um método equivalente para tornar um número positivo negativo?



3
280Z28: Isso é equivalente a myInt = -1.
recursivo

1
tem que ser myInt | = int.MinValue;
22330 Charles Bretana

@ 280Z28: Isso só funciona para números ímpares, caso contrário é o mesmo que fazer o número negativo, e, em seguida, subtraindo 1.
Cecil tem um nome

3
Para maior clareza do código, acho que você não deve usar System.Math.Abs ​​() se quiser apenas "converter um número negativo em positivo". Matematicamente, não é isso que Valor Absoluto é, mesmo que você obtenha o resultado desejado. Dependendo do seu contexto algorítmico, você deve usar a solução que você aceitou abaixo para passar de negativo para positivo também.
22430 Chris Dwyer

Respostas:


452

E se

myInt = myInt * -1


55
Esta solução é ótima porque também pode converter negativo em positivo! Gênio!
Will Eddins 28/08/09

19
Fiquei com a impressão de que você poderia simplesmente colocar um "-" na frente de qualquer coisa para negá-lo ... -myInt Isso seria o negativo do valor em myInt ... -ABS (myInt) seria um negativo com retorno voluntário.
DataDink

12
que tal myInt = - Myint?
kokbira

9
ou ainda mais curto myInt *= - 1?
Nawfal #

Para sua informação, se você tentar o método de kokbira com um curto, o myShort = (short) -myShortelenco é necessário porque o curto se torna um int quando negado.
AaronLS

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

29
+1 por lembrar que, se já for negativo, você terá o efeito oposto. Sua resposta é a única que sempre forneceria um número negativo, independentemente de o myNumber ser positivo ou negativo.
David

Apenas 26 votos para esta resposta? Existem usuários de SO que acham que isso não funcionaria?
MusiGenesis

6
30 votos? Já a pergunta é tão simples. E essa resposta muito complicada (-System.Math.Abs ​​(myNumber) também faria) obtém 30 votos positivos ????
mmmmmmmm

4
@revevens todos que tentam colaborar para indicar esta resposta estão muito mais corretos do que o aceito. Além disso, - vs * -1 definitivamente não é "muito complicado".
Rex M

4
Gosto mais desta resposta que do -System.Math.Abs, uma vez que é um pouco mais óbvio de relance o que está acontecendo ... Acho que seria um pouco mais fácil perder o "-" na frente da declaração.
Beska

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

11
Sim, porque a negação é o objetivo, então um menos unário é o operador certo. Por outro lado, multiplicar por um negativo é apenas um truque para negar um valor.
Steven Sudit 28/08/09

38
É um truque, porque conta com um efeito colateral, não com o principal efeito. O efeito primário de menos unário é negar. O principal efeito da multiplicação é multiplicar. Acontece que multiplicar por -1 nega. Isso é mais claro?
Steven Sudit 28/08/09

5
@StevenSudit Não, não é melhor que * -1. Multiplicar por -1 não é "um truque", é a maneira matemática de tornar um número negativo. -Number é apenas uma abreviação de -1 * Number. Além disso, usar Abs para manter o número negativo é um exagero. myInt<0 ? myInt : -myInt;é muito melhor. Só porque o operador - é fornecido como uma abreviação para o número -1 * adequado, mais os recursos de sobrecarga, não torna * (-1) um truque.
ThunderGr

93

Da mesma maneira que você torna qualquer outra coisa negativa: coloque um sinal negativo na frente.

var positive = 6;
var negative = -positive;

8
Todo mundo esquece o menos unário.
recursivo

Qual é a diferença prática entre esta e esta resposta: stackoverflow.com/questions/1348080/… int myNegInt = System.Math.Abs(myNumber) * (-1);
goodguys_activate

@ makerofthings7, aquele ao qual você vinculou é muito mais instruções da CPU - uma operação de valor absoluto (pelo menos três instruções no x86), seguida por um MUL (ou possivelmente um NEG se o compilador for inteligente). Esta resposta é um código de operação NEG leve e único, nada mais ou menos do que o que você precisa. Obviamente, as duas respostas se comportam de maneira diferente quando o número de entrada já é negativo; se (ao contrário desta pergunta) sua contribuição pode ser negativa, isso toma a decisão por você.
21312 Joe White

41

Nota para todos que responderam com

- Math.Abs(myInteger)

ou

0 - Math.Abs(myInteger)

ou

Math.Abs(myInteger) * -1

como uma maneira de manter números negativos negativos e tornar positivos números negativos.

Essa abordagem tem uma única falha. Não funciona para todos os números inteiros. O intervalo do Int32tipo é de "-2 31 " a "2 31 - 1." Isso significa que há mais um número "negativo". Consequentemente, Math.Abs(int.MinValue)lança um OverflowException.

A maneira correta é usar instruções condicionais:

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

Essa abordagem funciona para "todos" números inteiros.


Vou lhe mostrar a questão da correção, mas qualquer código que dependa de ninguém usar o Abs of MinValue é quebradiço.
Steven Sudit 28/08/09

Steven: Às vezes, você está resolvendo um problema (como Abs) que não pode funcionar int.MinValue(assumindo o inttipo de retorno). Nesse caso, não há problema em lançar uma exceção. No entanto, esse problema específico tem um resultado "válido" para, int.MinValuemas gera uma exceção se você seguir a Absrota.
Mehrdad Afshari 28/08/09

Depois de dizer que a escala negativa é maior que a positiva, você sugere um código que não explica isso. Se né -32768então -né TAMBÉM -32768!!! Além disso, int neg = n < 0 ? n : -n;não pode funcionar em todos os casos, pois um dos ternários não faz absolutamente nada.
Clive Galway

20

O caminho fácil:

myInt *= -1;

1
Estava prestes a publicar o mesmo, todos devem mostrar o * = um pouco de amor :-)
Brian Scott

16
int negInt = 0 - myInt;

Ou garantido para ser negativo.

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

11

Para mudar o sinal de um número inteiro, basta usar o operador de sinal:

myInt = -myInt;

Para torná-lo negativo, independentemente de o valor original ser negativo ou não, primeiro use o método Abs:

myInt = -Math.Abs(myInt);

6

Apenas para mais diversão:

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
Muito arriscado, IMHO. E se a definição de um círculo mudar?
MusiGenesis

6

EDIT: Isso está errado para entradas positivas ... Eu cometi o erro de esquecer que o resto dos bits em -x (valor do complemento 2s) são o 'oposto' do seu valor em + x, não é o mesmo. Portanto, simplesmente alterar o bit do sinal NÃO funcionará para números positivos.

Vou deixar isso aqui para fins ...

Ou da maneira mais complicada (eu acho) ...

int y = x | ~ int.MaxValue;

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

tão

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

e, portanto, qualquer int32 Or'ed com isso colocará 1 no bit de sinal (tornando-o negativo) e deixará todos os outros bits iguais ...

EDIT: na verdade, como 1000 1000 0000 0000 0000 0000 0000 0000 0000 é realmente o Minvalue, isso também deve funcionar:

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

Então, zero negativo é igual a int.MinValue?
recursiva

Não, no complemento de dois, não há zero negativo. todos os queridos é negativo 1. A Assinado 8Bit Int: 10000000 é -128
Charles Bretana

1
+1 porque ninguém merece voto negativo por responder a uma pergunta como "que letra vem depois de A, mas antes de C?"
MusiGenesis

... e, graças à resposta da @ Mehrad abaixo, esta é a única abordagem que funciona quando a entrada é int.MinValue ...
Charles Bretana

Charles: Isso está errado. Para números negativos, funciona, mas para números positivos, apenas virar o sinal não é suficiente -number. 1são todos zeros e um. Ou-ing-lo com int.MinValueresultará 10000000000000000000000000000001 que não é igual a -1(todos os queridos.)
Mehrdad Afshari

6

Mesmo que eu esteja muito atrasado para a festa aqui, vou falar com alguns truques úteis dos meus dias de hardware. Todos eles assumem a representação de elogio de 2 para números assinados.

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

Gostaria de explicar isso mais? com i == int.MinValue, em seguida, todas as variáveis são-2147483648
Clive Galway

5

Apenas por diversão:

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

Atualização : a beleza dessa abordagem é que você pode facilmente refatorá-la em um gerador de exceções:

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

5

eu uso myInt = -myInt;

Tão simples e fácil

Se você quer ter apenas positivo

myInt = myInt>0 ? myInt : -myInt;

Eu estava procurando por essa resposta em uma situação um pouco diferente do OP. Eu quero ter 2 valores negar ao outro, se um deles é de -5 a outra deve ser de 5, e por isso este é o meu melhor solução = D
Mathieu Brouwers

você teria um excesso desde o int.MaxValueé 2147483647, mesmo var i = int.MaxValue; i++;não vai funcionar
CMS

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

Ninguém disse que tinha que haver um número negativo em particular .


Hum, se você não se importa que ele deva ser um número negativo específico , você pode simplificar isso para "long negativeNumber = -1;"
Beska

@ Guffa: essa é a piada aqui, na verdade.
MusiGenesis 18/10/11




0

Convertendo um número de positivo para negativo ou negativo para positivo:

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

0

Apenas algo que eu quero compartilhar.

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

Como mencionado anteriormente, apenas multiplicar por -1 não é legal, pois int.MinValue * -1 == int.MinValue

Realmente depende da sua aplicação, mas para os meus (eixos de inversão do joystick), quero garantir que todos os extremos ainda sejam alcançáveis ​​e manter a maior fidelidade possível.
Para esse fim, * -1
mapeio Max <--> Min e tudo o que é intermediário recebe um. Usando esta técnica, -32767 é inacessível ao inverter.

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


A inversão para 5não é -5, mas 1/5.
Dafie

-2

Use binário e para remover o último bit responsável pelo sinal negativo.

Ou use binário ou para adicionar sinal a um tipo de dados.

Este soln pode parecer absurdo e incompleto, mas posso garantir que este é o método mais rápido.

Se você não experimentar o que eu publiquei, este post pode parecer uma porcaria: D

Por exemplo, para int:

Int é um tipo de dados de 32 bits, portanto o último bit (32º) determina o sinal.

E com um valor que tenha 0 no lugar 32 e resto 1. Ele converterá não negativo em + ve.

Pelo contrário ou com um valor com 1 no 32º lugar e descanse 0.


-3

X=*-1pode não funcionar em todos os compiladores ... uma vez que lê um 'multiply' 'SUBTRACT' 1 em vez de NEGATIVE O melhor alt é X=(0-X), [QUAL É DIFERENTE DE X-=X]

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.