В соответствии с C11 проект №1515 для WG14:
Заголовок
<ctype.h>объявляет несколько функций, полезных для классификации и отображения символов. Во всех случаях аргумент равенint, значение которого должно быть представлено какunsigned charили должно равное значению макросаEOF. Если аргумент имеет любое другое значение, поведение undefined.
Это поведение undefined?:
#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;
}
Позволяет ли стандарт пропускать char до isspace() (char to int)? Другими словами, char после преобразования в int, представляемого как unsigned char?
Здесь wiktionary определяет "представимый" :
Способность быть представленным.
Может ли char быть представленным как unsigned char? Да. §6.2.6.1/4:
Значения, хранящиеся в объектах без битового поля любого другого типа объекта состоят из n
×CHAR_BITбит, где n - размер объекта этого тип, в байтах. Значение может быть скопировано в объект типа без знака char [n] (например, memcpy); результирующий набор байтов называемое представлением объекта значения.
sizeof(char) == 1 поэтому его представление объекта unsigned char[1], т.е. char может быть представлено как unsigned char. Где я ошибаюсь?
Конкретный пример, я могу представить [-2, -1, 0, 1] как [0, 1, 2, 3]. Если я не могу тогда почему?
Связано: Согласно §6.3.1.3 isspace((unsigned char)c) является переносимым, если INT_MAX >= UCHAR_MAX в противном случае это определяется реализацией.