Because none of the HW monitors are perfect. I like Speedfan, but it does not always put the right label on the sensors. That is probably what is happening with you. Your CPU and system are probably 38° and 39°, or the other way around. The negative readings are probably due to no sensor and Speedfan does not know to just make is 0 or blank.
If your computer is self or custom built, I recommend you use the monitoring program that came with your motherboard. It will be on the utilities disk, or on the motherboard maker's website.
I actually prefer
CoreTemp for newer Intel and AMD64 CPUs. [url="http://<a%20href="http://www.techpowerup.com/realtemp/"%20target="_blank">
http://www.techpower...m/realtemp/</a>"]
RealTemp[/url] for Intels is also popular, as is
Motherboard Monitor.
You might try
Everest to verify the temperatures (as it is able to put sensor to label correctly), then edit the label in your monitoring program. In Everest, look under Computer > Sensor, then wait a couple seconds for the readings to appear. Unfortunately, Everest does not minimize to the system tray to show real-time temperatures, otherwise, you could use Everest instead of the others.