Кто-то может объяснить, как со знаком из символа является конкретная платформа?

Вы подразумеваете, что C++ / Java утверждает для "программирования согласно контракту" утверждения, или CppUnit/JUnit утверждает? Тот последний вопрос приводит меня полагать, что это - первый.

Интересный вопрос, потому что это - мое понимание, что те утверждают, часто выключаются во времени выполнения, когда Вы развертываетесь к производству. (Своего рода поражения цель, но это - другой вопрос.)

я сказал бы, что их нужно оставить в Вашем коде, когда Вы тестируете его. Вы тесты записи, чтобы гарантировать, что предварительные условия осуществляются правильно. Тест должен быть "черным квадратом"; необходимо действовать как клиент к классу, когда Вы тестируете. Если Вы, оказывается, выключаете их в производстве, оно не делает недействительным тесты.

10
задан Adam Naylor 31 July 2009 в 11:26
поделиться

6 ответов

Предположим, что ваша платформа имеет восьмибитные байты, и предположим, что у нас есть битовый шаблон 10101010 . Для подписанного char это значение равно -86. Однако для unsigned char тот же битовый шаблон представляет 170. Мы не перемещали никаких битов; это одни и те же биты, интерпретируемые двумя разными способами.

Теперь о char . В стандарте не сказано, какая из этих двух интерпретаций должна быть правильной. char , содержащий битовую комбинацию 10101010 , может быть либо -86 , либо 170. Это будет одно из этих двух значений, но вы должны знать компилятор и платформу, прежде чем сможете предсказать, какой это будет. Некоторые компиляторы предлагают переключатель командной строки, чтобы указать, какой из них будет. Некоторые компиляторы имеют разные значения по умолчанию в зависимости от того, на какой ОС они работают, поэтому они могут соответствовать соглашению об ОС.

В большинстве случаев это не имеет значения. В целях перегрузки они рассматриваются как три различных типа. Указатели на один из этих типов несовместимы с указателями на другой тип. Попробуйте вызвать strlen с символом со знаком * или символом без знака * ; это не сработает.

Используйте знаковый символ , если вам нужен однобайтовый числовой тип со знаком, и используйте unsigned char , если вам нужен однобайтный беззнаковый числовой тип. Используйте старый добрый символ , если хотите хранить символы. Вот о чем думал программист, когда писал typedef, о котором вы спрашиваете. Имя «байт» не имеет коннотации для хранения символьных данных, тогда как имя «unsigned char» содержит слово «char» в своем имени, и это заставляет некоторых людей думать, что это хороший тип для хранения символов или что Хорошая идея - сравнить его с переменными типа char .

Поскольку вы вряд ли будете выполнять общие арифметические действия с символами, он победит '

18
ответ дан 3 December 2019 в 14:25
поделиться

Вы что-то неправильно поняли. подписанный символ всегда подписан. unsigned char всегда беззнаковый. Но то, является ли простой char подписанным или неподписанным, зависит от реализации - это означает, что это зависит от вашего компилятора. В этом отличие от типов int, которые все подписаны (int совпадает с signed int, short совпадает с signed short). Более интересным является то, что char, signed char и unsigned char рассматриваются как три разных типа с точки зрения перегрузки функций. Это означает, что вы можете иметь в одном модуле компиляции три перегрузки функций:

void overload(char);
void overload(signed char);
void overload(unsigned char);

Для типов int наоборот, вы не можете иметь

void overload(int);
void overload(signed int);

, потому что int и int со знаком - одно и то же.

17
ответ дан 3 December 2019 в 14:25
поделиться

Правильнее будет сказать, что это зависит от компилятора, и вам не следует рассчитывать на то, что char подписан или неподписан при использовании char без ] signed или unsigned квалификатор.

В противном случае вы столкнетесь со следующей проблемой: вы пишете и отлаживаете программу, предполагая, что char подписан по умолчанию, а затем перекомпилируете если компилятор предполагает иное, и поведение программы резко меняется. Если вы полагаетесь на это предположение только время от времени в своем коде, вы рискуете столкнуться с непреднамеренным поведением в некоторых случаях, которое запускается в вашей программе только при определенных условиях и очень трудно обнаружить и отладить.

3
ответ дан 3 December 2019 в 14:25
поделиться

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

Типы символов в C и C ++

2
ответ дан 3 December 2019 в 14:25
поделиться

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

0
ответ дан 3 December 2019 в 14:25
поделиться

знаковый символ всегда 8-битный и всегда имеет знаковый бит в качестве последнего бита.

беззнаковый символ всегда 8-битный и не имеет знакового бита.

char, насколько я знаю, всегда беззнаковый. Любой компилятор, по умолчанию использующий подписанный char, столкнется с множеством несовместимых программ.

-6
ответ дан 3 December 2019 в 14:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: