I tried to reproduce but it worked all as expected (partly simulated) with Arduino 2009 && IDE 0021. A dive into the code of print() shows that the char is casted to a long before printing when using base HEX. For sources of print see C:\Program Files (x86)\arduino-0021\hardware\arduino\cores\arduino\print.cpp
3 questions:
which arduino are you using?
which ide version?
is this happening in a big program that maybe runnning out or RAM?
char is a SIGNED value. So anything above 127 will have the signbyte extended into the long. Just use byte b = c ; or similar and then you do not get the leadings FFs.
I think Msquare already got the point, char is a signed 8bit integer. The value you are printing is probably 0xAB (which equals -0x55)
To clarify this issue, what is the output of
Serial.println((uint8_t) readReg(0x00), HEX);
If the output is AB then everything should become clear.