Code:
uint8_t us = 150, os = 130, d123 = 151;

int32_t bar (void)
{
    uint16_t usus = us*us;
    uint16_t osos = os*os;
    uint16_t usos = us*os;
    uint16_t d123d123 = d123*d123;
    return ((int32_t) usus+osos-d123d123)*512 / usos;
}
Die Quadrate werden berechnet als 8*8 = 16, denn int ist bei avr-gcc 16 Bits breit. Daher wird bei den Operationen implizit zu 16 Bits erweitert.

Bei der 32-Bit OP muss der Cast innerhalb der Klammern stehen. Ansonsten wird mit 16 Bits gerechnet und erst danchauf 32 Bits erweitert. Die Strichrechnungen sollen aber auf 32 Bit signed erfolgen. Wenn die 2 nicht gekürzt wird, dann muss auch in den Nenner ein Cast, weil sonst das *2 auch auf 16 Bit gemacht wird. Ausserdem kann dann ein Überlauf problematisch werden, der einen positiven Wert zu einem negativen macht.

Du hast hier 3 Effekte, die zusammenspielen:
-- Explizite Casts
-- Implizite Casts
-- Übergang von Unsigned- zu Signed-Arithmetik

Wenn du dir in Bezug auf die C-Spez nicht sicher bist, dann mach es häppchenweise und nicht in einem großen Klumbatsch. Viel Klammern helfen net viel