[C++]Скажите, это нормально вообще?
ну наверно потому что надо передавать беззнаковый char, а не какой попало...
_ASSERTEunsigned charc + 1) <= 256);
т. к. ты приводишь к unsigned int => если отрицательное то получим 0xffffff.. > 0xff
Сильно. Но зачем <=, вполне хватило бы просто <.
вполне хватило бы простоэто да )
(unsigned charc + 1) <= 256А слабо придумать условие, при котором это неверно?
Вообще-то функция не может проверить тип переданного значения (есть, правда, RTTI, но это все-таки из другой оперы). Это вам не VB с его Variant-ом. Можно проверить, укладывается ли значение в некоторый диапазон. Например, диапазон значений типа char:
с >= -128 && c <= 127
или unsigned char:
с >= 0 && c <= 255
Альтернативные варианты (думаю, работают быстрее):
(c + 128) & ~255
c & ~255
Причем все это работает при условии, что char занимает 1 байт.
Поэтому когда я в BOOST тестирую на равенство два значения, хотя бы одно из которых отрицательное типа char, то (видимо, там такая реализация) вызывается для проверки эта функция, и проверка не проходит. Забавно, что если в BOOST_CHECK_EQUALS передать отрицательный char, приведенный к signed char, то такой проверки не производится.
(unsigned charc + 1) <= 256
истинно для любого "c"
хотя может наверное зависеть от компилятора
А ведь +1?
хотя может наверное зависеть от компилятора
Это не зависит от компилятора. Разве что от платформы. Если найдёте платформу, где unsigned char шире 8 бит.
В
(unsigned charc + 1)
к типу unsigned char приводится выражение (c+1 после чего значение этого выражения не может превышать 1 << BITS_IN_CHAR) - 1). Последнее на всех известных мне платформах равно 255.
Оставить комментарий
erotic
isctype.cФункция проверяет, что переданное значение с - типа char. И вот если ей передать отрицательный char... она, конечно, скажет, что ни хрена это и не char. Это вообще как понимать? MSVC2005