Разница между подписанным / неподписанным символом [дубликат]



этот вопрос уже есть ответ здесь:



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

527   8  

8 ответов:

в языке C нет выделенного "типа символов". char - Это целочисленный тип, такой же (в этом отношении) как int,short и другие целочисленные типы. char просто оказывается наименьшим целочисленным типом. Поэтому, как и любой другой целочисленный тип, он может быть знаковым или беззнаковым.

это правда, что (как следует из названия) char в основном предназначен для представления символов. Но символы в C представлены их целочисленными "кодами", поэтому в них нет ничего необычного дело в том, что целочисленный тип char используется для этой цели.

единственная общая разница между char и другие целочисленные типы, что просто char обычно не является синонимом signed char, в то время как с другими типами целое число signed модификатор является необязательным/подразумеваемым.

Я немного не согласен с вышесказанным. Элемент unsigned 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 как символ," без знака " полностью игнорируется компилятором так же, как комментарии удаляются из вашей программы.

есть три типа символов: (plain)char,signed char и unsigned char. Любой символ обычно является 8-битным целым числом* и в этом смысле a signed и unsigned char имеют полезное значение (обычно эквивалентно uint8_t и int8_t). При использовании в качестве символа в смысле текста, использовать char (также упоминается как простой символ). Обычно это signed char но может быть реализован в любом случае компилятором.

* технически, символ может быть любого размера до тех пор, как sizeof(char) is 1, но обычно это 8-битное целое число.

представление одно и то же, смысл другой. например, 0xFF, он оба представлены как "FF". Когда он обрабатывается как" char", это отрицательное число -1; но это 255 как без знака. Когда дело доходит до Сдвига битов, это большая разница, так как знаковый бит не сдвигается. например, если вы сдвинете 255 вправо на 1 бит, он получит 127; смещение "-1" вправо не будет иметь никакого эффекта.

"знаковый символ" - это знаковое значение, которое обычно меньше и гарантированно не будет больше, чем "короткий". "Unsigned char" - это беззнаковое значение, которое обычно меньше и гарантированно не будет больше, чем "short". Тип 'char' без знакового или беззнакового квалификатора может вести себя как знаковый или беззнаковый символ; обычно это определяется реализацией, но есть несколько случаев, когда это не так:

  1. Если в целевой набор символов платформы, любой из символов, требуемых стандартом C, будет сопоставляться с кодом, превышающим максимальный знаковый символ, тогда "char" должен быть без знака.
  2. Если 'char' и 'short' имеют одинаковый размер, то 'char' должен быть подписан.

часть причины, по которой есть два диалекта "C" (те, где "char" подписан, и те, где он не подписан), заключается в том, что есть некоторые реализации, где "char"должны быть без подписи, и другие, где это должны быть подписан.

, потому что char сохраняется при всех эффектах в виде 8-битного числа. Говоря о негативе или позитиве char не имеет смысла, если вы считаете его ASCII-код (который может быть просто подписан*), но имеет смысл, если вы используете char для хранения числа, которое может быть в диапазоне 0-255 или в -128..127 согласно представлению с двумя дополнениями.

*: Он также может быть без знака, это на самом деле зависит от реализации я думаю, в этом случае у вас будет доступ к расширенный ASCII-символов, предусмотренных кодирование используется

так же, как и int может быть положительным или отрицательным. Нет никакой разницы. На самом деле на многих платформах неквалифицированные это.

таким же образом -- например, если у вас есть 8-битный символ, 7 бит можно использовать для величины и 1 для знака. Таким образом, беззнаковый символ может варьироваться от 0 до 255, в то время как знаковый символ может варьироваться от -128 до 127 (например).

Comments

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