Может ли кто-нибудь объяснить, насколько подписанность char является специфичной для платформы?
Недавно я прочитал, что различия между
char
unsigned char
и
signed char
является специфичной для платформы.
Я не могу это понять? означает ли это, что последовательность бит может варьироваться от одной платформы к следующей, т.е. к платформе1, знак - это первый бит, платформа2 - знак в конце? как бы вы процитировали против этого?
В основном мой вопрос возникает из этой строки:
typedef unsigned char byte;
Я не понимаю значимость вывесок?
Ответы
Ответ 1
Предположим, что ваша платформа имеет восьмибитовые байты, и предположим, что у нас есть бит-шаблон 10101010
. Для signed char
это значение равно " 86. Для unsigned char
, однако, тот же бит-шаблон представляет 170. Мы не перемещали никаких битов; это одни и те же биты, интерпретируемые двумя разными способами.
Теперь для char
. В стандарте не указано, какая из этих двух интерпретаций должна быть правильной. A char
, содержащий бит-шаблон 10101010
, может быть либо минус 86, либо 170. Это будет одно из этих двух значений, но вы должны знать компилятор и платформу, прежде чем сможете предсказать, что это будет. Некоторые компиляторы предлагают ключ командной строки для управления тем, какой он будет. Некоторые компиляторы имеют разные значения по умолчанию в зависимости от того, на какой ОС они работают, поэтому они могут соответствовать соглашению ОС.
В большинстве кодеков это действительно не имеет значения. Для целей перегрузки они рассматриваются как три различных типа. Указатели на один из этих типов несовместимы с указателями на другой тип. Попробуйте вызвать strlen
с помощью signed char*
или unsigned char*
; это не сработает.
Используйте signed char
, если вам нужен однобайтовый числовой тип с цифрами, и используйте unsigned char
, если вам нужен однобайтовый неподписанный числовой тип. Используйте обычный старый char
, если вы хотите удерживать символы. Это то, о чем думал программист при написании typedef, о котором вы спрашиваете. Имя "байт" не имеет коннотации хранения символьных данных, тогда как имя "unsigned char" имеет слово "char" в его имени, и это заставляет некоторых людей думать, что это хороший тип для хранения символов, или что это хорошая идея сравнить его с переменными типа char
.
Поскольку вы вряд ли выполняете общую арифметику на символах, не имеет значения, подписана ли char
или без знака на любой из платформ и компиляторов, которые вы используете.
Ответ 2
Вы что-то неправильно поняли. подписанный char всегда подписан. unsigned char всегда без знака. Но независимо от того, подписана ли обычная char или неподписанная является специфичной для реализации - это означает, что она зависит от вашего компилятора. Это отличает от типов int, которые все подписаны (int совпадает с подписанным int, short - это то же самое, что и short short). Более интересно то, что char, подписанный char и unsigned char рассматриваются как три различных типа с точки зрения перегрузки функций. Это означает, что вы можете иметь в одном модуле компиляции три функции перегрузки:
void overload(char);
void overload(signed char);
void overload(unsigned char);
Для типов int наоборот, вы не можете иметь
void overload(int);
void overload(signed int);
потому что int и signed int совпадают.
Ответ 3
Правильнее сказать, что он специфичен для компилятора, и вы не должны рассчитывать на char
быть подписанным или неподписанным при использовании char
без signed
или unsigned
.
В противном случае вы столкнулись бы со следующей проблемой: вы пишете и отлаживаете программу, предполагая, что char
подписывается по умолчанию, а затем перекомпилируется с компилятором, предполагая иное, и поведение программы резко меняется. Если вы полагаетесь на это предположение только раз в то время в своем коде, вы рискуете столкнуться с непреднамеренным поведением в некоторых случаях, которые запускаются только в вашей программе в определенных условиях и очень трудно обнаружить и отладить.
Ответ 4
Возможно, вы имеете в виду тот факт, что подпись char
является специфичной для компилятора/платформы. Вот запись в блоге, которая проливает свет на него:
Типы символов в C и С++
Ответ 5
Наличие подписанного char больше похоже на то, как все базовые переменные обрабатываются в C, обычно не полезно иметь отрицательные символы.
Ответ 6
подписанный char всегда 8 бит и всегда имеет бит, подписанный как последний бит.
unsigned char всегда 8 бит и не имеет знакового бита.
a char насколько я знаю, всегда без знака. Любой компилятор, не выполнивший по умолчанию подписанный char, столкнется с множеством несовместимых программ.