Здесь есть потенциальная проблема:
Если реализация с CHAR_BIT == 8
использует представление величины знака для char
(таким образом, char
подписано), тогда когда UTF-8 требует битовый шаблон 10000000
, который является отрицательным 0. Так что , если реализация далее не поддерживает отрицательный 0, то данная строка UTF-8 может содержать недопустимое (trap) значение char
, что проблематично.Даже если он поддерживает отрицательный ноль, тот факт, что битовая комбинация 10000000
сравнивается равной char
с битовой комбинацией 00000000
(нулевой терминатор), может вызвать проблемы при использовании данных UTF-8 в char[]
.
Я думаю, это означает, что для реализаций знака C11 значение char
должно быть без знака.Обычно реализация зависит от того, является ли char
подписанным или неподписанным, но, конечно, если подпись char
приводит к неправильной реализации литералов UTF-8, тогда исполнителю просто нужно выбрать неподписанный.Кроме того, это имело место для реализаций C ++, не являющихся дополнениями 2, поскольку C ++ позволяет использовать char
, а также unsigned char
для доступа к представлениям объектов.C допускает только unsigned char
.
В дополнении 2 и дополнении 1 битовые комбинации, требуемые для данных UTF-8, являются действительными значениями signed char
, поэтому реализация может сделать char
подписаннымили без знака и по-прежнему может представлять строки UTF-8 в char[]
.Это потому, что все 256-битные шаблоны являются допустимыми значениями дополнения 2, и UTF-8 не использует байт 11111111
(отрицательный ноль дополнения 1 с).