Если Вы намереваетесь хранить произвольные двоичные данные, необходимо использовать unsigned char
. Это - единственный тип данных, который, как гарантируют, не будет иметь никаких дополнительных битов по Стандарту C. Друг друга тип данных может содержать дополнительные биты в своем объектном представлении (который является тем, который содержит все биты объекта, вместо только тех, который определяет значение). Дополнительное состояние битов является неуказанным и не используется для хранения значений. Таким образом, при чтении использования char
некоторые двоичные данные вещи были бы сокращены к диапазону значений символа (путем интерпретации только битов значения), но могут все еще быть биты, которые просто проигнорированы, но все еще являются там и читают memcpy
. Во многом как дополнение битов в реальных объектах структуры. Тип unsigned char
, как гарантируют, не будет содержать их. Это следует 5.2.4.2.1/2
(C99 TC2, n1124 здесь):
, Если значение объекта символа типа рассматривают как целое число со знаком при использовании в выражении значение
CHAR_MIN
должно совпасть со значениемSCHAR_MIN
, и значениеCHAR_MAX
должно совпасть со значениемSCHAR_MAX
. Иначе значениеCHAR_MIN
должно быть 0, и значение [1 110] должно совпасть со значением [1 111]. значениеUCHAR_MAX
должно равняться2^CHAR_BIT − 1
От последнего предложения из этого следует, что нет никакого пространства, уехал в любые дополнительные биты. Если Вы используете char
в качестве типа своего буфера, у Вас также есть проблема переполнения: Присвоение любого значения явно к одному такому элементу, который находится в диапазоне [1 115] биты - таким образом, можно ожидать, что такое присвоение будет в порядке - но не в диапазоне char
, который является CHAR_MIN
.. CHAR_MAX
, такая реализация переполнения и причин преобразования определила результаты, включая повышение сигналов.
, Даже если бы какие-либо проблемы относительно вышеупомянутого, вероятно, не показали бы в реальных реализациях (был бы очень низкое качество реализации), Вы являетесь лучшими для использования правильного типа с начала вперед, которое является unsigned char
.
Для строк, однако, предпочтительный тип данных char
, который будет понят под функциями печати и строкой. Используя [1 121] в этих целях похож на неправильное решение мне.
Для получения дополнительной информации, читайте this proposal
, которые содержат фиксацию для следующей версии Стандарта C, который в конечном счете потребует signed char
не, имеют любые дополнительные биты также. Это уже включено в рабочий документ .
С тех пор меня указали к этому коду синтаксического анализа на основе XML , а также к этому аналогичному проекту на CodeProject . Чем больше, тем лучше и ближе я подхожу к "идеальной" посадке.