What should be fixed there to display negative temperature properly?
As I've read DS18B20 datasheet, negative temperature output will always have 4 MSB bits set to 1111. But what's wrong with the above conversion formula?
you may have read the DS18B20 datasheet but you are using code for a DS18S20 so the first step is work out what you really have and then use the correct method