В соответствии с 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
в противном случае это определяется реализацией.