Согласно C11 проекту WG14 версии N1570:
Заголовок
<ctype.h>
объявляет несколько функций, полезных для классификации и сопоставления символов. Во всех случаях аргументом являетсяint
, значение которого должно быть представлено какunsigned char
или равно значению макросаEOF
. Если аргумент имеет любое другое значение, поведение не определено.
Это неопределенное поведение?:
#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
на int
)? Другими словами, можно ли char
после преобразования в int
представить как unsigned char
?
Вот как викисловарь определяет понятие "репрезентативный":
Способен быть представленным.
Может ли char
быть представлено как unsigned char
? Да. §6.2.6.1/4:
Значения, хранящиеся в объектах без битовых полей любого другого типа объекта, состоят из n
×
CHAR_BIT
бит, где n – размер объекта. этого типа в байтах. Значение может быть скопировано в объект типа unsigned 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
в противном случае определяется реализацией.
char
может быть беззнаковым, поэтомуCHAR_MIN
может быть0
. Для знакового символа-1
является допустимым значением, но оно не может быть представлено какunsigned char
(оно не входит в диапазон представляемых значений для этого типа). - person dyp   schedule 11.09.2014char
этоsigned
(это обычное). я обновлю вопрос - person jfs   schedule 11.09.2014signed
-ness простогоchar
должен быть задокументирован, поэтому он определяется только реализацией, независимо от того, является ли оно неопределенным поведением или четко определенным. - person Deduplicator   schedule 11.09.2014isspace
и т. д. могут быть реализованы через массив, например. в типичной системеchar const spaces[256] = { 0,0,0,0,0,0,0,0,0,1,0,0,1,0,
...#define isspace(x) ((int)spaces[x])
. Хотя на практике я подозреваю, что обычные компиляторы будут поддерживать отрицательные аргументы только потому, что передача отрицательного аргумента является такой распространенной ошибкой. - person M.M   schedule 11.09.2014spaces[(unsigned char)x]
- person jfs   schedule 11.09.2014