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

c++ c char

543680 просмотра

16 ответа

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

Автор: Landon Kuhn Источник Размещён: 11.11.2019 02:01

Ответы (16)


527 плюса

Решение

В C ++ есть три разных типа символов:

  • char
  • signed char
  • unsigned char

Если вы используете типы символов для текста , используйте неквалифицированное char:

  • это тип символьных литералов, таких как 'a'или '0'.
  • это тип, который составляет строки C, как "abcde"

Он также работает как числовое значение, но не определено, будет ли это значение рассматриваться как подписанное или без знака. Остерегайтесь сравнений персонажей из-за неравенства - хотя если вы ограничиваете себя ASCII (0-127), вы почти в безопасности.

Если вы используете типы символов в качестве чисел , используйте:

  • signed char, который дает вам, по крайней мере, диапазон от -127 до 127. (Обычно от -128 до 127)
  • unsigned char, который дает вам по крайней мере диапазон от 0 до 255.

«По крайней мере», потому что стандарт C ++ дает только минимальный диапазон значений, который должен охватывать каждый числовой тип. sizeof (char)должен быть равен 1 (т. е. один байт), но теоретически байт может составлять, например, 32 бита. sizeofвсе равно будет сообщать о его размере как ... это1 означает, что вы могли бы иметь sizeof (char) == sizeof (long) == 1.

Автор: Fruny Размещён: 17.09.2008 09:04

84 плюса

Это зависит от реализации, так как стандарт C НЕ определяет подпись char. В зависимости от платформы, char может быть signedили unsigned, так что вам нужно явно запросить signed charили unsigned charзависит от этого ваша реализация. Просто используйте, charесли вы намереваетесь представлять символы из строк, так как это будет соответствовать тому, что ваша платформа помещает в строку.

Разница между signed charи unsigned charесть, как и следовало ожидать. На большинстве платформ signed charэто будет 8-разрядное число с двумя дополнительными числами в диапазоне от -128до 127и unsigned char8-разрядное целое число без знака ( 0до 255). Обратите внимание, что стандарт НЕ требует, чтобы charтипы имели 8 битов, только sizeof(char)возвращаемый 1. Вы можете получить количество бит в символе с помощью CHAR_BITin limits.h. Однако сегодня существует немного платформ, где это будет нечто иное, чем 8.

Существует резюме хорошего этого вопроса здесь .

Как уже упоминалось с тех пор, как я это опубликовал, лучше использовать, int8_tи uint8_tесли вы действительно хотите представлять маленькие целые числа.

Автор: Todd Gamblin Размещён: 16.09.2008 06:08

34 плюса

Поскольку я чувствую, что это действительно необходимо, я просто хочу изложить некоторые правила C и C ++ (они одинаковы в этом отношении). Во- первых, все биты от unsigned charучастия в определении стоимости , если какой - либо объект без знака полукокса. Во-вторых, unsigned charявно указано без знака.

Теперь у меня была дискуссия с кем-то о том, что происходит, когда вы конвертируете значение -1типа int в unsigned char. Он отказался от идеи, что в результате unsigned charвсе биты установлены в 1, потому что он беспокоился о представлении знака. Но он не должен. Из этого правила сразу следует, что преобразование выполняет то, что предназначено:

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

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

  1. Все биты участвуют в определении его значения, то есть в объекте не происходит битов заполнения.
  2. Добавление только один раз , UCHAR_MAX+1чтобы -1даст значение в диапазоне, а именноUCHAR_MAX

На самом деле этого достаточно! Поэтому, когда вы хотите иметь unsigned charвсе свои биты один, вы делаете

unsigned char c = (unsigned char)-1;

Из этого также следует, что преобразование - это не просто усечение битов более высокого порядка. Счастливым событием для дополнения двоих является то, что это просто усечение, но то же самое не обязательно верно для других представлений знаков.

Автор: Johannes Schaub - litb Размещён: 14.01.2009 11:30

24 плюса

Как например использование неподписанного символа :

unsigned char часто используется в компьютерной графике, которая очень часто (хотя и не всегда) назначает один байт для каждого компонента цвета. Обычно цвет RGB (или RGBA) представлен в виде 24 (или 32) битов, каждый из которых является беззнаковым символом . Поскольку значения unsigned char попадают в диапазон [0,255], значения обычно интерпретируются как:

  • 0 означает полное отсутствие данного компонента цвета.
  • 255 означает 100% данного цветного пигмента.

Таким образом, вы получите красный RGB как (255,0,0) -> (100% красный, 0% зеленый, 0% синий).

Почему бы не использовать подписанный символ ? Арифметика и сдвиг бит становится проблематичным. Как уже объяснялось, диапазон подписанных символов существенно смещен на -128. Очень простой и наивный (в основном неиспользуемый) метод преобразования RGB в оттенки серого заключается в усреднении всех трех цветовых компонентов, но это приводит к проблемам, когда значения цветовых компонентов являются отрицательными. Красный (255, 0, 0) составляет в среднем (85, 85, 85) при использовании беззнаковой арифметики. Однако, если бы значения были подписаны char s (127, -128, -128), мы бы получили (-99, -99, -99), что будет (29, 29, 29) в нашем пространстве без знака. , что неверно.

Автор: Zachary Garrett Размещён: 17.09.2008 02:44

13 плюса

Если вы хотите использовать символ в виде небольшого целого числа, самый безопасный способ сделать это с int8_tи uint8_tтипов.

Автор: jbleners Размещён: 16.09.2008 06:12

7 плюса

unsigned charпринимает только положительные значения .... как от 0 до 255

в то время как

signed charпринимает как положительные, так и отрицательные значения .... как -128 до +127

Автор: munna Размещён: 22.01.2013 10:41

6 плюса

charи unsigned charгарантированно не будут 8-битными типами на всех платформах - они гарантированно будут 8-битными или более. Некоторые платформы имеют 9-битные, 32-битные или 64-битные байты . Однако наиболее распространенные на сегодняшний день платформы (Windows, Mac, Linux x86 и т. Д.) Имеют 8-битные байты.

Автор: bk1e Размещён: 17.09.2008 05:49

5 плюса

Беззнаковый символ - это (беззнаковое) байтовое значение (от 0 до 255). Вы можете думать о «char» как о «персонаже», но это действительно числовое значение. Обычный символ "char" подписан, поэтому у вас есть 128 значений, и эти значения отображаются на символы с использованием кодировки ASCII. Но в любом случае то, что вы храните в памяти, является байтовым значением.

Автор: Zac Gochenour Размещён: 16.09.2008 06:16

5 плюса

signed charимеет диапазон от -128 до 127; unsigned charимеет диапазон от 0 до 255.

char будет эквивалентен знаковому или неподписанному символу, в зависимости от компилятора, но это отдельный тип.

Если вы используете строки в стиле C, просто используйте char. Если вам нужно использовать символы для арифметики (довольно редко), укажите для подписи явно или без знака для переносимости.

Автор: James Hopkin Размещён: 16.09.2008 06:12

4 плюса

С точки зрения прямых значений обычный символ используется , когда значения , как известно, между CHAR_MINи в CHAR_MAXто время как символ без знака обеспечивает двойную диапазон от положительного конца. Например, если CHAR_BITравно 8, диапазон регулярных значений charгарантированно будет только [0, 127] (потому что он может быть подписан или не подписан), в то время как unsigned charбудет [0, 255] и signed charбудет [-127, 127].

С точки зрения того, для чего он используется, стандарты позволяют напрямую преобразовывать объекты POD (простые старые данные) в массив без знака. Это позволяет вам изучить представление и битовые структуры объекта. Та же самая гарантия безопасного типа наказания не существует для символа или подписанного символа.

Автор: Julienne Walker Размещён: 16.09.2008 06:17

2 плюса

Если вам нравится использовать различные типы определенной длины и подписи, вам, вероятно, лучше использовать uint8_t, int8_t, uint16_t и т. Д. Просто потому, что они делают именно то, что говорят.

Автор: Dark Shikari Размещён: 16.09.2008 06:18

2 плюса

Беззнаковый символ использует бит, зарезервированный для знака обычного символа, в качестве другого числа. Это изменяет диапазон на [0 - 255], а не на [-128 - 127].

Обычно неподписанные символы используются, когда вы не хотите знак. Это будет иметь значение при выполнении таких вещей, как смещение битов (смещение расширяет знак) и другие вещи при работе с символом как байтом, а не с использованием его в качестве числа.

Автор: JasonOfEarth Размещён: 16.09.2008 06:20

2 плюса

беззнаковый символ - сердце всех хитростей. Почти во всех компиляторах для платформы ALL неподписанный символ - это просто BYTE. Целое число без знака (обычно) 8 бит. это можно рассматривать как маленькое целое число или пакет битов.

В зависимости, как сказал кто-то еще, стандарт не определяет знак символа. Таким образом, у вас есть 3 различных типа "char": char, подписанный char, unsigned char.

Автор: ugasoft Размещён: 16.09.2008 07:14

1 плюс

Некоторые погуглили это , где люди обсуждали это.

Неподписанный символ - это в основном один байт. Таким образом, вы можете использовать это, если вам нужен один байт данных (например, возможно, вы захотите использовать его для включения и выключения флагов, передаваемых в функцию, как это часто делается в Windows API).

Автор: dbrien Размещён: 16.09.2008 06:16

1 плюс

char без знака принимает только положительные значения: от 0 до 255 char со знаком принимает положительные и отрицательные значения: от -128 до +127

Автор: NL628 Размещён: 24.11.2017 10:40

0 плюса

цитата из книги "C программирования laugage":

Квалификатор signedor unsignedможет применяться к char или любому целому числу. числа без знака всегда положительны или равны нулю и подчиняются законам арифметики по модулю 2 ^ n, где n - количество бит в типе. Так, например, если символы состоят из 8 битов, переменные без знака имеют значения от 0 до 255, в то время как знаковые символы имеют значения от -128 до 127 (в машине дополнения до двух). Независимо от того, являются ли обычные символы со знаком или без знака, это машина -зависимые, но печатные символы всегда положительны.

Автор: ZhaoGang Размещён: 21.07.2017 03:20
Вопросы из категории :
32x32