The output operator << when being passed a char (signed or unsigned) will write it as a character.
Those function will return values of type unsigned char. And as noted above that will print the characters those values represent in the current encoding, not their integer values.
The + operator converts the unsigned char returned by those functions to an int through integer promotion. Which means the integer values will be printed instead.
An expression like +std::numeric_limits<unsigned char>::lowest() is essentially equal to static_cast<int>(std::numeric_limits<unsigned char>::lowest()).