Что такое неподписанный символ?
543680 просмотра
16 ответа
В C / C ++, для чего unsigned char
используется? Чем он отличается от обычного char
?
Ответы (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
.
84 плюса
Это зависит от реализации, так как стандарт 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
in limits.h
. Однако сегодня существует немного платформ, где это будет нечто иное, чем 8
.
Существует резюме хорошего этого вопроса здесь .
Как уже упоминалось с тех пор, как я это опубликовал, лучше использовать, int8_t
и uint8_t
если вы действительно хотите представлять маленькие целые числа.
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?
- Все биты участвуют в определении его значения, то есть в объекте не происходит битов заполнения.
- Добавление только один раз ,
UCHAR_MAX+1
чтобы-1
даст значение в диапазоне, а именноUCHAR_MAX
На самом деле этого достаточно! Поэтому, когда вы хотите иметь unsigned char
все свои биты один, вы делаете
unsigned char c = (unsigned char)-1;
Из этого также следует, что преобразование - это не просто усечение битов более высокого порядка. Счастливым событием для дополнения двоих является то, что это просто усечение, но то же самое не обязательно верно для других представлений знаков.
Автор: Johannes Schaub - litb Размещён: 14.01.2009 11:3024 плюса
Как например использование неподписанного символа :
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:4413 плюса
Если вы хотите использовать символ в виде небольшого целого числа, самый безопасный способ сделать это с int8_t
и uint8_t
типов.
7 плюса
unsigned char
принимает только положительные значения .... как от 0 до 255
в то время как
signed char
принимает как положительные, так и отрицательные значения .... как -128 до +127
6 плюса
char
и unsigned char
гарантированно не будут 8-битными типами на всех платформах - они гарантированно будут 8-битными или более. Некоторые платформы имеют 9-битные, 32-битные или 64-битные байты . Однако наиболее распространенные на сегодняшний день платформы (Windows, Mac, Linux x86 и т. Д.) Имеют 8-битные байты.
5 плюса
Беззнаковый символ - это (беззнаковое) байтовое значение (от 0 до 255). Вы можете думать о «char» как о «персонаже», но это действительно числовое значение. Обычный символ "char" подписан, поэтому у вас есть 128 значений, и эти значения отображаются на символы с использованием кодировки ASCII. Но в любом случае то, что вы храните в памяти, является байтовым значением.
Автор: Zac Gochenour Размещён: 16.09.2008 06:165 плюса
signed char
имеет диапазон от -128 до 127; unsigned char
имеет диапазон от 0 до 255.
char
будет эквивалентен знаковому или неподписанному символу, в зависимости от компилятора, но это отдельный тип.
Если вы используете строки в стиле C, просто используйте char
. Если вам нужно использовать символы для арифметики (довольно редко), укажите для подписи явно или без знака для переносимости.
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:172 плюса
Если вам нравится использовать различные типы определенной длины и подписи, вам, вероятно, лучше использовать uint8_t, int8_t, uint16_t и т. Д. Просто потому, что они делают именно то, что говорят.
Автор: Dark Shikari Размещён: 16.09.2008 06:182 плюса
Беззнаковый символ использует бит, зарезервированный для знака обычного символа, в качестве другого числа. Это изменяет диапазон на [0 - 255], а не на [-128 - 127].
Обычно неподписанные символы используются, когда вы не хотите знак. Это будет иметь значение при выполнении таких вещей, как смещение битов (смещение расширяет знак) и другие вещи при работе с символом как байтом, а не с использованием его в качестве числа.
Автор: JasonOfEarth Размещён: 16.09.2008 06:202 плюса
беззнаковый символ - сердце всех хитростей. Почти во всех компиляторах для платформы ALL неподписанный символ - это просто BYTE. Целое число без знака (обычно) 8 бит. это можно рассматривать как маленькое целое число или пакет битов.
В зависимости, как сказал кто-то еще, стандарт не определяет знак символа. Таким образом, у вас есть 3 различных типа "char": char, подписанный char, unsigned char.
Автор: ugasoft Размещён: 16.09.2008 07:141 плюс
Некоторые погуглили это , где люди обсуждали это.
Неподписанный символ - это в основном один байт. Таким образом, вы можете использовать это, если вам нужен один байт данных (например, возможно, вы захотите использовать его для включения и выключения флагов, передаваемых в функцию, как это часто делается в Windows API).
Автор: dbrien Размещён: 16.09.2008 06:161 плюс
char без знака принимает только положительные значения: от 0 до 255 char со знаком принимает положительные и отрицательные значения: от -128 до +127
Автор: NL628 Размещён: 24.11.2017 10:400 плюса
цитата из книги "C программирования laugage":
Квалификатор signed
or unsigned
может применяться к char или любому целому числу. числа без знака всегда положительны или равны нулю и подчиняются законам арифметики по модулю 2 ^ n, где n - количество бит в типе. Так, например, если символы состоят из 8 битов, переменные без знака имеют значения от 0 до 255, в то время как знаковые символы имеют значения от -128 до 127 (в машине дополнения до двух). Независимо от того, являются ли обычные символы со знаком или без знака, это машина -зависимые, но печатные символы всегда положительны.
Вопросы из категории :
- c++ What are the barriers to understanding pointers and what can be done to overcome them?
- c++ Какой самый простой способ для анализа файла INI в C ++?
- c++ Когда вы должны использовать «друг» в C ++?
- c++ Как вы очищаете переменную stringstream?
- c++ В C ++ конструктор и деструктор могут быть встроенными функциями?
- c++ Что такое виртуальный базовый класс в C ++?
- c Как вы форматируете unsigned long long int, используя printf?
- c Как реализовать продолжения?
- c Как вы передаете функцию в качестве параметра в C?
- c Как получить список каталогов в C?
- c В чем разница между #include <filename> и #include "filename"?
- char Что такое неподписанный символ?
- char Как преобразовать std :: string в const char * или char *?
- char Строковый литерал в c ++ создан в статической памяти?
- char Java: как проверить, принадлежит ли символ определенному блоку Unicode?
- char Как преобразовать один символ в int
- char Как преобразовать символ в целое число в Python и наоборот?