A ja robię tak:
Odczytuję 16 bitów z DS18B20 (i jest to liczba signed, np. int), następnie mnożę przez 100, dodaję do tego 8 i dzielę przez 16. Dzięki temu mam gotowy wynik temperatury w setnych Celcjusza, a potem to już z górki (liczba ciągle jest jako signed). Też tu nie ma zmiennych typu float/double oraz nie ma żadnych przesuwań bitowych i sprawdzania bitów na pewnych pozycjach itp...
Np. tak:
Zaloguj się, aby zobaczyć kod
Wtedy części całkowite mamy po wydzieleniu całości przez 100, a ułamkowe (setne) po wydzieleniu modulo 100 (reszta z dzielenia przez 100). Oczywiście do robienia stringa z tego można sprawdzić znak przed dzieleniami i jeśli ujemnym to wyświetlić minus a liczbę ujemna pomnożyć przez -1 do dalszych obróbek (by mieć ją jako dodatnią). Ale to już chyba jasne.