The 20ms is between sensing the ready status - you only need to wait 750ms or whatever if you are _not_ polling the conversion status.
Unless you use parasite power it is fine to poll the conversion status regularly - this allows you to do other useful work while the A/D conversion happens.
Original problem was clearly one of sign-extension (a well known 'gotcha' in C style languages)
Basically if you ever shift right or divide a number, then it matters if that variable was declared unsigned or not. Another related issue is doing tests like
byte a = ..... ;
if (a < 0)
{
}
The if is never going to test true because byte is unsigned, and an unsigned number can never be negative...