Convierta un número positivo a negativo en C #


142

Puede convertir un número negativo a positivo de esta manera:

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

¿Existe un método equivalente para hacer que un número positivo sea negativo?



3
280Z28: Eso es equivalente a myInt = -1.
recursivo el

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

@ 280Z28: Eso solo funciona para números impares, de lo contrario es lo mismo que hacer que el número sea negativo y luego restar 1.
Cecil tiene un nombre

3
Para la claridad del código, no creo que deba usar System.Math.Abs ​​() si solo quiere "convertir un número negativo a positivo". Matemáticamente, eso no es lo que es el valor absoluto, a pesar de que obtienes el resultado deseado. Dependiendo de su contexto algorítmico, debe usar la solución que ha aceptado a continuación para pasar de negativo a positivo también.
Chris Dwyer

Respuestas:


452

Qué tal si

myInt = myInt * -1


55
¡Esta solución es excelente porque también puede convertir lo negativo en positivo! ¡Genio!
Will Eddins

19
Tenía la impresión de que podría simplemente colocar un "-" delante de cualquier cosa para negarlo ... -myInt Esto sería lo negativo del valor en myInt ... -ABS (myInt) sería un negativo garaunteed.
DataDink

12
¿qué pasa myInt = - Myint?
kokbira

9
o incluso más corto myInt *= - 1?
nawfal el

Para su información, si prueba el método de kokbira con un short, el myShort = (short) -myShortlanzamiento es necesario porque el short se convierte en int cuando se niega.
AaronLS

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

29
+1 por recordar que si ya fuera negativo tendrías el efecto contrario. Su respuesta es la única que siempre daría un número negativo independientemente de si myNumber es positivo o negativo.
David

¿Solo 26 votos por esta respuesta? ¿Hay usuarios SO que piensan que esto no funcionaría?
MusiGenesis

66
30 votos arriba? La pregunta ya es muy simple. ¿Y esta respuesta demasiado complicada (-System.Math.Abs ​​(myNumber) también funcionaría) obtiene 30 votos?
mmmmmmmm

44
@rstevens todos intentan en colaboración indicar que esta respuesta es mucho más correcta que la aceptada. Además, - vs * -1 definitivamente no es "demasiado complicado".
Rex M

44
Me gusta esta respuesta mejor que la respuesta de -System.Math.Abs, ya que es un poco más obvio de un vistazo lo que está sucediendo ... Creo que sería un poco más fácil pasar por alto el "-" frente a la declaración.
Beska

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

11
Sí, porque el objetivo es la negación, por lo que un menos unario es el operador correcto. Por otro lado, multiplicar por uno negativo es solo un truco para negar un valor.
Steven Sudit

38
Es un truco porque cuenta con un efecto secundario, no con el efecto primario. El efecto primario de unario menos es negar. El efecto primario de la multiplicación es multiplicar. Sucede que multiplicar por -1 niega. ¿Eso está más claro?
Steven Sudit

55
@StevenSudit No, no mejor que * -1. Multiplicar por -1 no es "un truco", es la forma matemática de convertir un número negativo. -Número es solo una abreviatura de -1 * Número. Además, usar Abs para mantener el número negativo es una exageración. myInt<0 ? myInt : -myInt;es mucho mejor. El hecho de que el operador - se proporcione como una abreviatura para el Número -1 * más las capacidades de sobrecarga, no hace que * (-1) sea un truco.
ThunderGr

93

De la misma manera que haces cualquier otra cosa negativa: pon un signo negativo delante de ella.

var positive = 6;
var negative = -positive;

8
Todos olvidan el menos unario.
recursivo

¿Cuál es la diferencia práctica entre este y esta respuesta: stackoverflow.com/questions/1348080/... int myNegInt = System.Math.Abs(myNumber) * (-1);
goodguys_activate

@ makerofthings7, al que se vinculó hay muchas más instrucciones de CPU: una operación de valor absoluto (al menos tres instrucciones en x86), seguida de un MUL (o posiblemente un NEG si el compilador es inteligente). Esta respuesta es un código de operación NEG único y liviano, ni más ni menos de lo que necesita. Por supuesto, las dos respuestas se comportan de manera diferente cuando el número de entrada ya es negativo; si (a diferencia de esta pregunta) su aporte puede ser negativo, eso toma la decisión por usted.
Joe White

41

Nota para todos los que respondieron con

- Math.Abs(myInteger)

o

0 - Math.Abs(myInteger)

o

Math.Abs(myInteger) * -1

como una forma de mantener los números negativos negativos y convertir los positivos en negativos.

Este enfoque tiene un solo defecto. No funciona para todos los enteros. El rango de Int32tipo es de "-2 31 " a "2 31 - 1." Significa que hay un número "negativo" más. En consecuencia, Math.Abs(int.MinValue)lanza un OverflowException.

La forma correcta es usar declaraciones condicionales:

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

Este enfoque funciona para "todos" los enteros.


Te diré el punto de corrección, pero cualquier código que dependa de que nadie tome el Abs de MinValue es frágil.
Steven Sudit

Steven: A veces, estás resolviendo un problema (como Abs) que posiblemente no funcione int.MinValue(suponiendo un inttipo de retorno). En ese caso, está completamente bien lanzar una excepción. Sin embargo, este problema específico tiene un resultado "válido" int.MinValuepero genera una excepción si toma la Absruta.
Mehrdad Afshari

Después de decir que la escala negativa es mayor que la positiva, entonces va y sugiere un código que no tiene en cuenta esto. ¡Si nes -32768entonces -nTAMBIÉN -32768! Además int neg = n < 0 ? n : -n;, no puede funcionar en todos los casos, ya que uno de los ternarios no hace absolutamente nada.
Clive Galway

20

La manera fácil:

myInt *= -1;

1
Estaba a punto de publicar lo mismo, todos deberían mostrar el * = algo de amor :-)
Brian Scott

16
int negInt = 0 - myInt;

O garantizado para ser negativo.

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

11

Para cambiar el signo de un entero, solo usa el operador de signo:

myInt = -myInt;

Para hacerlo negativo independientemente de si el valor original es negativo o no, primero use el método Abs:

myInt = -Math.Abs(myInt);

6

Solo por más diversión:

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
Demasiado arriesgado, en mi humilde opinión. ¿Qué pasa si cambia la definición de un círculo?
MusiGenesis

6

EDITAR: Esto es incorrecto para entradas positivas ... Cometí el error de olvidar que el resto de los bits en -x (valor 2s-Complemento) son el 'opuesto' de su valor en + x, no es lo mismo. Entonces, simplemente cambiar el bit de signo NO funcionará para números positivos.

Dejaré esto aquí para fines ...

O la forma complicada (creo) ...

int y = x | ~ int.MaxValue;

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

entonces

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

y, por lo tanto, cualquier int32 Or'ed con eso pondrá un 1 en el bit de signo (haciéndolo negativo) y dejará todos los demás bits iguales ...

EDITAR: en realidad, dado que 1000 0000 0000 0000 0000 0000 0000 0000 es en realidad el Minvalue, esto también debería funcionar:

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

Entonces, el cero negativo es igual a int.MinValue?
recursivo

No, en el complemento de dos, no hay cero negativo. all ones es negativo 1. Un 8Bit Int firmado: 10000000 es -128
Charles Bretana

1
+1 porque nadie merece ser rechazado por responder una pregunta como "¿qué letra viene después de A pero antes de C?"
MusiGenesis

... y, gracias a la respuesta de @ Mehrad a continuación, este es el único enfoque que funciona cuando la entrada es int.MinValue ...
Charles Bretana

Charles: esto está mal. Para números negativos, funciona, pero para números positivos, simplemente voltear el bit de signo no funciona -number. 1Es todo ceros y uno. Hacer un pedido con int.MinValueesto resultará en 10000000000000000000000000000001 que no es igual a -1(todos)
Mehrdad Afshari

6

Aunque llego tarde a la fiesta aquí, voy a intervenir con algunos trucos útiles de mis días de hardware. Todos estos asumen la representación del cumplido de 2 para los números con signo.

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

¿Te importaría explicar esto más? con i == int.MinValue, entonces todas las variables son-2147483648
Clive Galway

5

Solo por diversión:

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

Actualización : la belleza de este enfoque es que puede refactorizarlo fácilmente en un generador de excepciones:

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

5

yo suelo myInt = -myInt;

Tan simple y fácil

Si quieres tener solo positivo

myInt = myInt>0 ? myInt : -myInt;

Estaba buscando esta respuesta en una situación ligeramente diferente a la del OP. Quiero tener 2 valores negados entre sí si uno de ellos es -5 y el otro debería ser 5, por lo tanto, esta es mi mejor solución = D
Mathieu Brouwers

obtendrías un desbordamiento ya que int.MaxValuees 2147483647, incluso var i = int.MaxValue; i++;no funcionará
CMS

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

Nadie dijo que tenía que ser un número negativo en particular .


Um, si no le importa que tenga que ser un número negativo en particular , podría simplificar esto a "long negativeNumber = -1;"
Beska

@Guffa: esa es la broma aquí, en realidad.
MusiGenesis




0

Convertir un número de positivo a negativo, o negativo a positivo:

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

0

Solo algo que quiero compartir.

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 se mencionó anteriormente, simplemente multiplicar por -1 no es genial, ya que int.MinValue * -1 == int.MinValue

Realmente depende de su aplicación, pero para el mío (Invertir los ejes de Joystick) quiero asegurarme de que todos los extremos aún sean alcanzables y mantener la mayor fidelidad posible.
Con este fin, mapeo Max <--> Min y todo lo que está en el medio obtiene un * -1
Uso de esta técnica, -32767 es inalcanzable al invertir.

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


Invertir a 5no es -5, pero 1/5.
dafie

-2

Use binario y para eliminar el último bit responsable del signo negativo.

O use binario o para agregar signos a un tipo de datos.

Esta solución puede sonar absurda e incompleta, pero puedo garantizar que este es el método más rápido.

Si no experimentas con lo que he publicado esta publicación puede parecer una mierda: D

Por ejemplo, para int:

Int es un tipo de datos de 32 bits, por lo que el último bit (el número 32) determina el signo.

Y con un valor que tiene 0 en el lugar 32 y resto 1. Convertirá no negativo a + ve.

Por el contrario o con un valor con 1 en el lugar 32 y resto 0.


-3

X=*-1es posible que no funcione en todos los compiladores ... ya que lee un 'sustrato' multiplicado '1 en lugar de NEGATIVO. La mejor alternativa es X=(0-X), [QUE ES DIFERENTE X-=X]

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.