Serial.read() returns a 16 bit signed int. It needs to do this so that it can return -1 when there is no data available to read. See Serial.read() - Arduino Reference
Returns
The first byte of incoming serial data available (or -1 if no data is available). Data type: int.
Note that the description of what is returned does not actually make sense because a byte cannot have a value of -1
You're right regarding the returned value. However, the data displayed in the terminal is a 32bits value (0xFFFFFFFF). And even if this value would be a 16bits signed int, it's casted into a char as c is is declared as char.
I still don't understand this issue...
i get "FFFFFFFF" when a char value of -1 is printed
i think the underlying code in Serial.print() is sign extending the value. i don't know what the default type is being used for a hex value