According to C11 WG14 draft version N1570:
The header
<ctype.h>declares several functions useful for classifying and mapping characters. In all cases the argument is anint, the value of which shall be representable as anunsigned charor shall equal the value of the macroEOF. If the argument has any other value, the behavior is undefined.
Is it undefined behaviour?:
#include <ctype.h>
#include <limits.h>
#include <stdlib.h>
int main(void) {
  char c = CHAR_MIN; /* let assume that char is signed and CHAR_MIN < 0 */
  return isspace(c) ? EXIT_FAILURE : EXIT_SUCCESS;
}
Does the standard allow to pass char to isspace() (char to int)? In other words, is char after conversion to int representable as an unsigned char?
Here's how wiktionary defines "representable":
Capable of being represented.
Is char capable of being represented as unsigned char? Yes. §6.2.6.1/4:
Values stored in non-bit-field objects of any other object type consist of n
×CHAR_BITbits, where n is the size of an object of that type, in bytes. The value may be copied into an object of type unsigned char [n] (e.g., by memcpy); the resulting set of bytes is called the object representation of the value.
sizeof(char) == 1 therefore its object representation is unsigned char[1] i.e., char is capable of being represented as an unsigned char. Where am I wrong?
Concrete example, I can represent [-2, -1, 0, 1] as [0, 1, 2, 3]. If I can't then why?
Related: According to §6.3.1.3 isspace((unsigned char)c) is portable if INT_MAX >= UCHAR_MAX otherwise it is implementation-defined.