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 char
or 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_BIT
bits, 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.