17 ответов:
в C++ есть три distinct типы символов:
charsigned charunsigned charесли вы используете типы символов для текст используйте безусловного
char:
- это тип символьных литералов, таких как
'a'или'0'.- это тип, который составляет строки C, такие как
"abcde"он также работает в качестве значения число, но это является неуказанным ли это значение рассматривается как подписанные, так и неподписанные. Остерегайтесь сравнения символов через неравенства-хотя, если вы ограничиваете себя ASCII (0-127), вы почти в безопасности.
если вы используете типы символов, как цифры использовать:
signed char, который дает вам по крайней мере диапазон от -127 до 127. (-128 до 127 общий)unsigned char, который дает вам at по крайней мере диапазон от 0 до 255."по крайней мере", потому что стандарт C++ дает только минимальный диапазон значений, которые должен охватывать каждый числовой тип.
sizeof (char)требуется 1 (т. е. один байт), но байт теоретически может быть, например, 32 бит.sizeofвсе равно будет сообщать свой размер как1- это значит, что ты может естьsizeof (char) == sizeof (long) == 1.
это зависит от реализации, так как стандарт C не определяет подписанность
char. В зависимости от платформы, char может бытьsignedилиunsigned, поэтому вам нужно явно попроситьsigned charилиunsigned charесли ваша реализация зависит от него. Просто используйтеcharЕсли вы собираетесь представлять символы из строк, так как это будет соответствовать тому, что ваша платформа помещает в строку.разницу между
signed charиunsigned charкак и следовало ожидать. На большинстве платформ,signed charбудет 8-битный номер дополнения два в диапазоне от-128до127иunsigned charбудет 8-битным целым числом без знака (0до255). Обратите внимание, что стандарт не требует этогоcharтипы имеют 8 бит, только этоsizeof(char)возвращение1. Вы можете получить количество бит в Символе сCHAR_BITнаlimits.h. Есть несколько, если какие-либо платформы сегодня, где это будет что-то другое, чем8, хотя.есть хорошее резюме этого вопроса здесь.
как другие уже упоминали, так как я опубликовал это, вам лучше использовать
int8_tиuint8_tесли вы действительно хотите представить небольшие целые числа.
потому что я чувствую, что это действительно необходимо, я просто хочу изложить некоторые правила C и c++ (они одинаковы в этом отношении). Во-первых, все биты на
unsigned charучаствовать в определении значения, если какой-либо объект без знака char. Во-вторых,unsigned charявно указывается без знака.сейчас, у меня была дискуссия с кем-то о том, что происходит, когда вы преобразовать значение
-1типа int tounsigned char. Он отказался от мысли, что в результатеunsigned charвсе биты установлены в 1, потому что он беспокоился о представлении знака. Но ему и не нужно этого делать. Это сразу же следует из этого правила, что преобразование делает то, что предназначено:если новый тип без знака, значение преобразуется путем многократного сложения или вычитание на единицу больше максимального значения, которое может быть представлено в новом типе до тех пор, пока значение находится в диапазоне нового типа. (
6.3.1.3p2в проекте C99)это математическое описание. C++ описывает его в терминах исчисления по модулю, что приводит к тому же правилу. Во всяком случае, что такое не гарантируется, что все биты в целое число
-1- один перед преобразованием. Итак, что у нас есть, чтобы мы могли утверждать, что полученныйunsigned charвсеCHAR_BITбиты превратились в 1?
- все биты участвуют в определении его значения - то есть, никакие биты заполнения не происходят в объекте.
- добавлять только один раз
UCHAR_MAX+1до-1даст a значение в диапазоне, а именноUCHAR_MAXна самом деле этого достаточно! Так что всякий раз, когда вы хотите иметь
unsigned charимея все свои биты один, вы делаетеunsigned char c = (unsigned char)-1;также следует, что преобразование не просто усечение битов более высокого порядка. Счастливое событие для дополнение это просто усечение там, но то же самое не обязательно верно для других представлений знака.
как например использования unsigned char:
unsigend char часто используется в компьютерной графике, которая очень часто (хотя и не всегда) присваивает один байт каждому цветовому компоненту. Обычно цвет RGB (или RGBA) представлен в виде 24 (или 32) бит, каждый из которых unsigned char. Так как unsigned char значения попадают в диапазон [0,255], значения обычно интерпретируются как
- 0 означает a полное отсутствие данного цветового компонента
- 255 означает 100% данного цветового пигмента
таким образом, вы бы в конечном итоге с RGB красный как (255,0,0) -> (100% красный, 0% зеленый, 0% синий).
Почему бы не использовать подпись Чара? Арифметика и сдвиг битов становятся проблематичными. Как уже было сказано,подпись Чара - это, по сути, переложил на -128. Очень простой и наивный (в основном неиспользуемый) метод преобразования RGB в оттенки серого - это усредняйте все три цветовых компонента, но это приводит к проблемам, когда значения цветовых компонентов отрицательны. Красный (255, 0, 0) средние (85, 85, 85) при использовании unsigned char арифметика. Однако, если значения были подпись Чараs (127, -128, -128), мы бы в конечном итоге с (-99, -99, -99), который был бы (29, 29, 29) В нашем unsigned char пробел, что неверно.
Если вы хотите использовать персонажа как небольшое целое число, самый безопасный способ сделать это с помощью тега
int8_tиuint8_tтипы.
charиunsigned charне гарантируются 8-битные типы на всех платформах-они гарантированно будут 8-битными или больше. Некоторые платформы имеют 9-битные, 32-битные или 64-битные байты. Тем не менее, наиболее распространенные платформы сегодня (Windows, Mac, Linux x86 и др.) есть 8-битные байты.
signed charимеет диапазон от -128 до 127;unsigned charимеет диапазон от 0 до 255.
charбудет эквивалентно знаковому или беззнаковому символу, в зависимости от компилятора, но является отдельным типом.если вы используете строки в стиле C, просто использовать
char. Если вам нужно использовать символы для арифметики (довольно редко), укажите signed или unsigned явно для переносимости.
unsigned charпринимает только положительные значения....как 0 до 255где
signed charпринимает как положительные, так и отрицательные значения....как -128 до +127
беззнаковый символ-это (беззнаковое) байтовое значение (от 0 до 255). Вы можете думать о" char "с точки зрения того, чтобы быть" персонажем", но это действительно числовое значение. Обычный "char" подписан, поэтому у вас есть 128 значений, и эти значения сопоставляются с символами с помощью кодировки ASCII. Но в любом случае, что вы храните в памяти является байт.
в терминах прямых значений используется обычный символ, когда значения, как известно, находятся между
CHAR_MINиCHAR_MAXв то время как беззнаковый символ обеспечивает двойной диапазон на положительном конце. Например, еслиCHAR_BIT8, диапазон регулярныхcharгарантируется только [0, 127] (потому что он может быть подписан или без знака) в то время какunsigned charбудет [0, 255] иsigned charбудет [-127, 127].С точки зрения того, для чего он используется, стандарты позволяют объектам POD (простые старые данные) быть непосредственно преобразуется в массив беззнаковых символов. Это позволяет изучить представление и битовые шаблоны объекта. Такая же гарантия безопасного типа каламбура не существует для char или подписанного char.
Если вам нравится использовать различные типы определенной длины и подписанности, вам, вероятно, лучше с uint8_t, int8_t, uint16_t и т. д. Просто потому, что они делают именно то, что они говорят.
unsigned char является сердцем всех бит обмана. Почти во всех компиляторах для всех платформ беззнаковый символ-это просто байт. Целое число без знака (обычно) 8 бит. это можно рассматривать как небольшое целое число или набор бит.
в зависимости, как кто-то сказал, стандарт не определяет знак символ. таким образом, у вас есть 3 различных типа "char": char, signed char, unsigned char.
беззнаковые числа are
always positive or zero, и подчинятьсяlaws of arithmetic modulo 2^n, гдеn- это количество бит в типе.пример: если символов 8 бит,
unsigned charпеременные имеют значения между0 and 255, аsigned charsиметь значения между-128 and 127.
немного погуглив нашел этой, где люди обсуждали это.
беззнаковый символ-это в основном один байт. Таким образом, вы можете использовать это, если вам нужен один байт данных (например, возможно, вы хотите использовать его для установки флагов включения и выключения для передачи функции, как это часто делается в API Windows).
беззнаковый символ использует бит, зарезервированный для знака обычного символа в качестве другого числа. При этом изменяется диапазон [0 - 255] в отличие от [-128 - 127].
вообще беззнаковые символы используются, когда вы не хотите подписывать. Это будет иметь значение при выполнении таких вещей, как сдвиг битов (сдвиг расширяет знак) и другие вещи при работе с символом как байтом, а не с его использованием в качестве числа.
цитата из книги" The C programming laugage":
классификатором
signedилиunsignedможет быть применен к char или любому целому числу. беззнаковые числа всегда положительно или равно нулю, и подчиняются законам арифметики по модулю 2^n, где n-число битов в типе. Так, например, если символы 8 бит, беззнаковые переменные char имеют значения между 0 и 255, в то время как знаковые символы имеют значения между -128 и 127 (в двух ' s комплемент машины.) Подписаны ли простые символы или неподписанный является машинно-зависимым, но печатные персонажи всегда положительные.
беззнаковый тип char принимает только положительные значения: от 0 до 255 знаковый символ принимает положительные и отрицательные значения: от -128 до +127
Comments