Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

99
Views
Operaciones aparentemente sin sentido en una macro

La siguiente macro proviene de una fuente MCAL de un microcontrolador y convierte los tics del temporizador en milisegundos.

 #define TICKS2MS(x) ( (uint64) (((((uint64)(x)) * 1) + 0) / 100000) )

¿Podría por favor ayudarme a entender el significado de multiplicar por 1 y sumar 0?

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

La multiplicación y la suma son, de hecho, inútiles, al igual que el molde exterior.

Ambos operadores realizan las conversiones aritméticas habituales en ambos operandos.

Para la multiplicación, el operando izquierdo tiene tipo uint64 (como resultado de la conversión) y el operando derecho tiene tipo int . Dado que uint64 es el tipo más grande, será el tipo del resultado. El operando 1 no cambia de valor como resultado de la conversión, por lo que al multiplicar por 1 el resultado tiene el mismo tipo y valor que (uint64)(x) .

De manera similar para la suma, los operandos son de tipo uint64 e int respectivamente, lo que significa que el tipo resultante es uint64 y 0 no cambia de valor después de la conversión. Entonces, al agregar 0, el resultado tiene el mismo tipo y valor que (uint64)(x) * 1 , que tiene el mismo tipo y valor que (uint64)(x) .

El cast al final también es superfluo, ya que la expresión casted ya tiene tipo uint64 . Como antes, el operador de división realiza las conversiones aritméticas habituales en sus operandos, por lo que dividir un uint64 por un int da como resultado un uint64 .

Así que la macro anterior es equivalente a:

 #define TICKS2MS(x) ((uint64)(x) / 100000)
over 4 years ago · Santiago Trujillo Report

0

Veo las palabras MCAL, TICKS2MS(x) y uint64 (no uint64_t de stdint.h )... y me parece que es un entorno AUTOSAR. (Deberías haber agregado la etiqueta autosar a la pregunta)

Los diferentes lanzamientos explícitos probablemente se deban a las comprobaciones de MISRA-C. Las herramientas de verificación de MISRA-C pueden ser bastante quisquillosas al respecto.

Si esa macro TICK2MS(x) es parte de xxx_Cfg.h o xxx_PBCfg.h (donde xxx es como Gpt , Mcu u Os ), lo más probable es que la genere la herramienta de configuración del controlador AUTOSAR/MCAL. Y luego, el factor, el desplazamiento y el divisor podrían ser parte del ajuste al preescalador y tal vez un TimerMaxValue (envolvente) o una corrección debido a un preescalador/frecuencia impar a la constelación de ticks, para corregir la falla. Si la configuración es tal que dicha función no se utiliza, la herramienta de configuración puede generar los valores predeterminados.

Dado que la macro contiene solo constantes, el compilador puede optimizar esto en un simple ((uint64)(x) / 100000) .

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!