Mach mal ein paar mehr Klammern um die Berechnung drum - damit auch die Reihenfolge korrekt eingehalten wird.
(düfte zwar daran nicht liegen, aber schaden kann es nicht)
Dann könnte es noch sein, das der Compiler einige Werte nicht als 16 Bit signed Integer behandelt - also mach mal z.B. vor den adc0 Wert ein
(int16_t)
und auch nochmal vor den ganzen Ausdruck.
(das nennt sich "type cast" also Typumwandlung)

Also so:
(int16_t)((((int16_t)adc0 - KMZ0MIN - ((KMZ0MAX-KMZ0MIN)/2))*1000)/(KMZ0MAX-KMZ0MIN));

Ich hoffe mal die Klammerung ist so wie Du es gemeint hast

MfG,
SlyD