Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

100
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda