Единственный способ UCHAR_MAX
будет больше INT_MAX
, если вы находитесь на машине с sizeof(int) == 1
; т. Е., где char
имеет столько раз, сколько int
. На этих машинах UCHAR_MAX
= UINT_MAX
≥ INT_MAX
.
На 32-разрядной (или более) машине это вряд ли будет проблемой. Пока значение в переменной c
происходит из текстового источника, текстового кодирования я не знаю, что приведет к переполнению. Даже «UTF-32» будет иметь только активные 21 бит. (На самом деле, так как мы обсуждаем нечетные системы, я должен сказать, что это работает для машин с sizeof(int)
= 1 и CHAR_BIT
≥ 22. ☺)
Если на такой машине is_digit()
все же был принят аргумент c
больше, чем INT_MAX
, не из текстового источника. Неопределенное поведение является следствием помещения несимвольных данных в переменную char
, и это всегда будет то, что программист сделал, не что-то вызвало реализацию.
Существует система, где эта может быть проблема: 16-битный char
и int
, и система использовала 16-разрядный код символа (например, UTF-16), где старший бит может быть установлен , Если это так, то перед реализацией необходимо определить равную char
как подписанную именно по этой причине. С подпиской char
он будет способствовать (подписано) int
и может быть смело передан в семейство функций is*()
; с char
без знака, оно будет способствовать до unsigned
int
и листы, подписанные int
, могут быть не определены.
В такой системе, ваш код действительно сломан, но это будет ваша собственная вина для совершенно ненужного преобразования в unsigned char
и опасном (в этой системе) литые (int)uchar
.
Резюмируя: В системах с sizeof(int) == 1
несет ответственность за осуществлением, чтобы гарантировать, что каждая точка кода, при хранении в char
переменной, может быть безопасно передается в ctype.h
функций (которые ожидают int
аргументы). Это может всегда быть сделано.Если вы сохранили что-то в переменной char
, которая не является точкой кода и передана ей на is*()
, то виной за неопределенное поведение является ваш & ваш.
На какой машине вы находитесь, где 'UCHAR_MAX' больше, чем' INT_MAX'? –
Должен ли я обслуживать весь мой код в отношении машины, на которой я работаю? –