Подтвердить что ты не робот

Разница между подписанным/без знака char

Итак, я знаю, что разница между подписанным и unsigned int заключается в том, что бит используется для обозначения того, является ли число положительным или отрицательным, но как это относится к char? Как персонаж может быть положительным или отрицательным?

4b9b3361

Ответ 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; это обычно определяется реализацией, но есть несколько случаев, когда это не так:

  1. Если в наборе символов целевой платформы любой из символов, требуемых стандартным 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 (например).