Что такое неподписанный символ?



В C / C++, что за unsigned char используется для? Чем он отличается от обычного char?

597   17  

17 ответов:

в C++ есть три distinct типы символов:

  • char
  • signed char
  • unsigned 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 to unsigned char. Он отказался от мысли, что в результате unsigned char все биты установлены в 1, потому что он беспокоился о представлении знака. Но ему и не нужно этого делать. Это сразу же следует из этого правила, что преобразование делает то, что предназначено:

если новый тип без знака, значение преобразуется путем многократного сложения или вычитание на единицу больше максимального значения, которое может быть представлено в новом типе до тех пор, пока значение находится в диапазоне нового типа. (6.3.1.3p2 в проекте C99)

это математическое описание. C++ описывает его в терминах исчисления по модулю, что приводит к тому же правилу. Во всяком случае, что такое не гарантируется, что все биты в целое число -1 - один перед преобразованием. Итак, что у нас есть, чтобы мы могли утверждать, что полученный unsigned char все CHAR_BIT биты превратились в 1?

  1. все биты участвуют в определении его значения - то есть, никакие биты заполнения не происходят в объекте.
  2. добавлять только один раз 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_BIT 8, диапазон регулярных 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

    Ничего не найдено.