Страницы

Поиск по вопросам

вторник, 18 февраля 2020 г.

Уместно ли использовать тип unsigned char для хранения чисел

#c #char


Например, если мне нужна целочисленная переменная в диапазоне [0; 255] могу я использовать
тип unsigned char? Появились сомнения по этому поводу, т.к. этот тип обычно используется
для хранения символов, а использование в качестве числа будет не совсем очевидно. Интересует,
не повредит ли это читабельности программы.
    


Ответы

Ответ 1



unsigned char не хранит символы. Это - числовой тип данных, также как и signed char. Символы представляются типом данных char, который может быть как знаковым, так и беззнаковым - и это третий тип данных, который отличается от первых двух. Поэтому использовать unsigned char для хранения чисел - вполне уместно. Но если вам нужен именно диапазон [0; 255] - то правильнее использовать uint8_t, а не unsigned char - потому что размер unsigned char может отличаться от привычного на экзотических платформах, а uint8_t либо 8 бит, либо не существует.

Ответ 2



Ответ для вопроса с редакцией #1: Строго говоря, для диапазона [0; 255] нужен по крайней мере unsigned char. компилятор сам выбирает каким именно типом будет char - signed или unsigned, в моем случае - последним. Вы вот задали вопрос: "Интересует, не повредит ли это читабельности программы". И тут же оправдываете свою ошибку поведением компилятора. Нелогично. В таком контексте ответ может быть только - да, повредит и даже очень! Если Вы заботитесь о читабельности кода, то должны по крайней мере убрать из него лишние зависимости. И да, char, signed char и unsigned char - разные типы данных.

Ответ 3



Строго говоря, ответ "нет". Тому есть несколько причин. 1) неоднократно упомянутая, для хранения целых чисел в диапазоне [0, 255] почти всегда можно использовать тип unsigned char. То, что на Вашем компиляторе тип char беззнаковый, приведет лишь к тому, что попытавшись использовать свой код на другой платформе (другом компиляторе) Вы столкнетесь с непредсказуемым поведением кода. 2) Более важная причина. Стандарт никак не гарантирует, что тип char занимает в памяти 8 бит. Да, я не знаю современных платформ, где это было бы не так, но тем не менее, Вы получите код, не соответствующий стандарту. В конце концов, кодировка ASCII неспроста изначально 7-битная. Корректно было бы использовать тип uint8_t определенный в заголовочном файле . Но и это надо делать с осторожностью, ибо (provided only if the implementation directly supports the type) (см http://en.cppreference.com/w/c/types/integer)

Комментариев нет:

Отправить комментарий