Ich löse mal auf:
In TempH erhälst Du nur die ersten 8 Bit der gemessenen Temperaur, da der Sensor hier (Kommando AAhex) auf halbe Kelvin genau ist, steckt im 9ten Bit (=LSB, abgespeichert ist es aber in TempL, und dort als einzigstes Bit und ganz links) die Information über die halben °C.
Die 8bit des TempH enthalten also gerade den ganzzahligen Anteil der Temperatur, mit abgehacktem Nachkommaanteil.
Das jetzt als abgerundet zu bezeichnen ist nicht ganz korrekt - es ist immer zur 0 hin gerundet (statt -34,738°C sind hier dann-34°C, also aufgerundet, obwohl es rund -35°C sein müßten) - da Du aber eh nicht mit den negativen Werten rechnest, sondern lediglich auf negativ prüfst, und dann ggf den Betrag von TempH berechnest (also über das Zweierkomplement), stimmt das dann am Ende wieder.
Ein Wert von 27,0..27,4999°C liefert ganzzahlig in TempH 27, und kein halb-Kelvin-Bit in TempL. abgerundet, paßt
Ein Wert von -27,0..-27,4999°C liefert ganzzahlig in TempH erstmal -27, wobei Du jetzt isNegative wahr setzt (für die Anzeige), und den Betrag berechnest, TempH ist jetzt also auch 27, HalbKelvinBit nicht gesetzt, isNegative und 27 paßt also auch.
Ein Wert von 27,5..27,9999°C liefert ganzzahlig aber immer noch 27, nur eben mit gesetztem HalbKelvinBit im TempL. isNegative und den Betrag brauchst Du nicht, da positiv, aber Deine Anzeige würde 27°C anzeigen, da TempH=27. Da der Sensor aber das HalbKelvinBit gesetzt hat, also mindestens ein halbes Kelvin mehr (weiter von der 0 weg), jedoch weniger als ein ganzes Kelvin mehr digitalisiert wurde, weißt Du, daß das Ergebnis gerundet 1 größer (weiter von der 0 weg) sein muß. Also (Katze aus demSack laß) erhöhst Du hier TempH um eins/addierst 1/inkrementierst es. Ergibt dann also 28°C auf dem Display, paßt.
Ein Wert von -27,5..-27,9999°C liefert entsprechend -27 im TempH und ein gesetztes HalbKelvinBit im TempL. Du setzt also isNegative und bildest für TempH den Betrag (=27), welcher aber wegen dem HalbKelvinBit zu inkrementieren ist (also=28). Mit isNegative zeigst Du also -28°C an, paßt auch.
zusammengefaßt also:
TempH und TempL auslesen
prüfen ob TempH negativ ist, in diesem Falle isNegative setzen und TempH seinen Betrag zuweisen, sonst isNegative löschen
prüfen, ob das halbKelvinBit in TempL gesetzt ist, in diesem Falle TempH um 1 erhöhen (="aufrunden des Betrages")
TempH in Dezimalstellen zerhacken, und für die Ausgabe bereitstellen
neu ist eigentlich nur der markierte Schritt, den Rest hast Du bereits