Итак, я знаю, что разница между подписанным и unsigned int заключается в том, что бит используется для обозначения того, является ли число положительным или отрицательным, но как это относится к char? Как персонаж может быть положительным или отрицательным?
Разница между подписанным/без знака char
Ответ 1
В языке C нет выделенного "символьного типа". char
- целочисленный тип, тот же (в этом отношении) как int
, short
и другие целочисленные типы. char
просто оказывается наименьшим целым типом. Таким образом, как и любой другой целочисленный тип, он может быть подписан или без знака.
Верно, что (как следует из названия) char
в основном предназначен для представления символов. Но символы в C представлены целыми "кодами", поэтому нет ничего необычного в том, что для этой цели используется целочисленный тип char
.
Единственное общее отличие между char
и другими целыми типами состоит в том, что plain char
обычно не является синонимом signed char
, тогда как с другими целыми типами модификатор signed
является необязательным/подразумеваемым.
Ответ 2
Я немного не согласен с вышеизложенным. без знака char просто означает: используйте самый старший бит вместо того, чтобы рассматривать его как флаг бита для знака +/- при выполнении арифметических операций.
Это имеет значение, если вы используете char как число:
typedef char BYTE1;
typedef unsigned char BYTE2;
BYTE1 a;
BYTE2 b;
Для переменной a доступно только 7 бит, а его диапазон (от -127 до 127) = (+/-) 2 ^ 7 -1. Для переменной b доступны все 8 бит и диапазон от 0 до 255 (2 ^ 8 -1).
Если вы используете char как символ, "unsigned" полностью игнорируется компилятором, так как комментарии удаляются из вашей программы.
Ответ 3
Существует три типа char: (plain) char
, signed char
и unsigned char
. Любой char обычно является 8-битным целым *, и в этом смысле a signed
и unsigned char
имеют полезный смысл (обычно эквивалентны uint8_t
и int8_t
). При использовании в качестве символа в смысле текста используйте char
(также называемый простой char). Обычно это signed char
, но может быть реализовано любым способом компилятором.
* Технически, char может быть любого размера, если sizeof(char)
равно 1, но обычно это 8-разрядное целое.
Ответ 4
Представление такое же, значение другое. например, 0xFF, оба они представлены как "FF". Когда он обрабатывается как "char", это отрицательное число -1; но он 255 как unsigned. Когда дело доходит до смещения битов, это большая разница, поскольку бит знака не сдвигается. например, если вы переместили 255 правых 1 бит, он получит 127; смещение "-1" справа не будет иметь эффекта.
Ответ 5
A 'подписанный char' является знаковым значением, которое обычно меньше, и гарантированно не больше, чем "короткий". "Unsigned char" - это значение без знака, которое обычно меньше, и гарантировано не больше, чем "короткое". Тип "char" без подписанного или неподписанного классификатора может вести себя как подписанный или без знака char; это обычно определяется реализацией, но есть несколько случаев, когда это не так:
- Если в наборе символов целевой платформы любой из символов, требуемых стандартным C, будет отображаться на код выше максимального знака char, тогда Если 'char' и 'short' имеют одинаковый размер, тогда необходимо подписать 'char'.
Отчасти из-за двух диалектов "C" (те, где "char" подписывается, и те, где он беззнаковый), есть некоторые реализации, где "char" должен be unsigned, а другие, где он должен быть подписан.
Ответ 6
Это потому, что char
хранится во всех эффектах как 8-битное число. Говоря об отрицательном или положительном char
, не имеет смысла, если вы считаете его ASCII-кодом (который может быть только что подписанным *), но имеет смысл, если вы используете этот char
для хранения числа, которое может находиться в диапазоне 0 -255 или в -128..127 в соответствии с представлением 2-комплемента.
*: он также может быть неподписанным, он действительно зависит от реализации, я думаю, в этом случае у вас будет доступ к расширенной кодировке ASCII, предоставляемой используемой кодировкой
Ответ 7
Точно так же, как int
может быть положительным или отрицательным. Нет никакой разницы. На самом деле на многих платформах подписан неквалифицированный char
.
Ответ 8
То же самое - например, если у вас есть 8-разрядный char, для знака и для знака можно использовать 7 бит. Таким образом, unsigned char может варьироваться от 0 до 255, тогда как подписанный char может варьироваться от -128 до 127 (например).