No hay un operador en C para cambiar el signo de un flotador, etc. int de negativo a positivo o viceversa?

StackOverflow https://stackoverflow.com/questions/2025788

Pregunta

tratando de encontrar valor absoluto y pensé que había una forma sencilla de simplemente invertir el signo con '~' o algo así.

¿Fue útil?

Solución

float newValue = oldValue * -1;

o

float newValue = -(oldValue); //() aren't needed, I just use them out of habit

Otros consejos

Para invertir el signo, poner un signo menos delante de él.

La negación simple con - funciona, pero la mayoría de las respuestas han ignorado el hecho de que el PO está tratando de hacer valor absoluto. Para ello, la herramienta correcta es abs() para enteros y fabs() de flotadores. El código será cristalina y el resultado será el esperado. (Edit:.. Asegúrese de leer la documentación y los errores de estas herramientas como Nick señala, negando el número más negativo con abs() devuelve el mismo número negativo)

El -(expr) operador de negación unaria hace exactamente lo que quiere.

int x = -7;
int y = 7;
x = -x; // x is now 7
y = -y; // y is now -7

El ~(expr) operador de bits complemento que usted menciona, por otro lado, voltea todos los bits en la entrada.

En caso de que ayuda, una cuestión que muchas implementaciones de valor absoluto en la naturaleza ignoran es que la negación del valor más negativo de un dado de tamaño fijo de dos de tipo complemento entero se desbordará.

-x le dará el valor del signo invertido de x.

tema complicado. La forma más directa para cambiar el signo de un número de punto flotante es para voltear el valor del bit más significativo de la variable. La notación que aparece en las otras respuestas está a merced del compilador, que es por lo general muy bien, pero no siempre. Por "float x", la respuesta es:

*(unsigned int*)&x ^= (1<<31)

Si usted está escribiendo para algo como el iPhone, que tiene un procesador Cortex A8 (o algo parecido), se quiere evitar dobles y también evitar los condicionales cuando se trabaja con los flotadores en bucles internos. Por lo tanto, usted puede hacer esto:

*(unsigned int*)&x ^= ( (x<0) << 31 );

Lo cual a su vez, negativos a positivos sin necesidad de utilizar una instrucción de salto. Si esto es en un bucle interno, será de 5 a 20 veces más rápido que con cualquier otro método, en el iPhone. Si no está en un bucle interno, entonces es probable que no le importa demasiado!

x = 0 - x;

? o me echo el punto?

Esta es una solución de mierda, no está seguro de lo que pasó aquí. Ver la respuesta a continuación con abs () para la correcta.

A pesar de que esta es una cuestión de edad, tal vez esta respuesta le ayudará a algunos de ustedes. Yo quería tener un valor positivo o negativo de un número basado en otro de los resultados (que permite decir un mustBeNegative booleano) la forma en que hice esto es:

int number = 7;
if(mustBeNegative)
{
      number = number * 1;
}
else
{
      number = number * -1;
}

El número será su valor positivo o negativo en función del valor "mustBeNegative". Cuando el número ya era un número negativo se convertirá en positivo y viceversa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top