Разница между подписанным / неподписанным символом [дубликат]
этот вопрос уже есть ответ здесь:
что такое беззнаковый символ?
17 ответов
чар!=(подпись char), char!=(символ без знака)
4 ответы
Так я знаю, что разница между подписанным и unsigned int - это бит, который используется для обозначения числа, если оно положительное или отрицательное, но как это относится к символу? Как персонаж может быть положительным или отрицательным?
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-битным целым числом* и в этом смысле asignedи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' без знакового или беззнакового квалификатора может вести себя как знаковый или беззнаковый символ; обычно это определяется реализацией, но есть несколько случаев, когда это не так:
- Если в целевой набор символов платформы, любой из символов, требуемых стандартом C, будет сопоставляться с кодом, превышающим максимальный знаковый символ, тогда "char" должен быть без знака.
- Если '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