es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Operador unario en AVR: comportamiento indefinido?

Tuve el problema de que

voltage = voltage*2/3;
y
voltage *= 2/3;

dieron resultados diferentes. La variable es uint16_t y se ejecuta en un microcontrolador AVR de 8 bits.
La primera declaración dio el resultado correcto, la segunda declaración siempre retornó 0.

Algunos amigos me dijeron que los operadores unarios no deberían usarse en general, lo cual me hizo reflexionar, ya que también uso cosas como PORTC &= ~(1 << csBit);. Para compilar, utilizo avr-gcc si eso te puede dar una idea.

Gracias de antemano por tu ayuda.

edit#1:

OK, entiendo que = no es un operador unario. Además, la diferencia subyacente es que '=' empieza desde la derecha y '*, /' empieza desde la izquierda.

Supongo que para los uints, ambas declaraciones no son correctas y tendría que escribir voltage = (uint16_t)((float)voltage*(float)2/3)

y gracias @Lundin por señalar cómo reaccionar correctamente a las respuestas.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en el orden de las operaciones en la segunda declaración, donde la multiplicación se evalúa antes de la división, dando como resultado 0 debido a la división entera. La primera declaración se evalúa como se desea debido al orden de las operaciones, donde la multiplicación se evalúa primero, seguida de la división.

    En cuanto al uso de operadores unarios, pueden usarse correctamente, pero es importante comprender su comportamiento y limitaciones. En el caso del ejemplo dado, el operador &= se utiliza para borrar un bit específico en un registro, lo cual es un uso común y aceptable.

    Para el tipo de variable uint, es importante asegurarse de que los cálculos se realicen utilizando los tipos de datos y conversiones adecuados, como se muestra en la declaración corregida “voltage = (uint16_t)((float)voltage*(float)2/3)”.

    Finalmente, utilizar avr-gcc para compilar es una buena elección para trabajar con microcontroladores AVR.

Comments are closed.