Может ли кто-нибудь объяснить, насколько подписанность 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, столкнется с множеством несовместимых программ.