Вы подразумеваете, что C++ / Java утверждает для "программирования согласно контракту" утверждения, или CppUnit/JUnit утверждает? Тот последний вопрос приводит меня полагать, что это - первый.
Интересный вопрос, потому что это - мое понимание, что те утверждают, часто выключаются во времени выполнения, когда Вы развертываетесь к производству. (Своего рода поражения цель, но это - другой вопрос.)
я сказал бы, что их нужно оставить в Вашем коде, когда Вы тестируете его. Вы тесты записи, чтобы гарантировать, что предварительные условия осуществляются правильно. Тест должен быть "черным квадратом"; необходимо действовать как клиент к классу, когда Вы тестируете. Если Вы, оказывается, выключаете их в производстве, оно не делает недействительным тесты.
Предположим, что ваша платформа имеет восьмибитные байты, и предположим, что у нас есть битовый шаблон 10101010
. Для подписанного char
это значение равно -86. Однако для unsigned char
тот же битовый шаблон представляет 170. Мы не перемещали никаких битов; это одни и те же биты, интерпретируемые двумя разными способами.
Теперь о char
. В стандарте не сказано, какая из этих двух интерпретаций должна быть правильной. char
, содержащий битовую комбинацию 10101010
, может быть либо -86 , либо 170. Это будет одно из этих двух значений, но вы должны знать компилятор и платформу, прежде чем сможете предсказать, какой это будет. Некоторые компиляторы предлагают переключатель командной строки, чтобы указать, какой из них будет. Некоторые компиляторы имеют разные значения по умолчанию в зависимости от того, на какой ОС они работают, поэтому они могут соответствовать соглашению об ОС.
В большинстве случаев это не имеет значения. В целях перегрузки они рассматриваются как три различных типа. Указатели на один из этих типов несовместимы с указателями на другой тип. Попробуйте вызвать strlen
с символом со знаком *
или символом без знака *
; это не сработает.
Используйте знаковый символ
, если вам нужен однобайтовый числовой тип со знаком, и используйте unsigned char
, если вам нужен однобайтный беззнаковый числовой тип. Используйте старый добрый символ
, если хотите хранить символы. Вот о чем думал программист, когда писал typedef, о котором вы спрашиваете. Имя «байт» не имеет коннотации для хранения символьных данных, тогда как имя «unsigned char» содержит слово «char» в своем имени, и это заставляет некоторых людей думать, что это хороший тип для хранения символов или что Хорошая идея - сравнить его с переменными типа char
.
Поскольку вы вряд ли будете выполнять общие арифметические действия с символами, он победит '
Вы что-то неправильно поняли. подписанный символ всегда подписан. 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 со знаком - одно и то же.
Правильнее будет сказать, что это зависит от компилятора, и вам не следует рассчитывать на то, что char
подписан или неподписан при использовании char
без ] signed
или unsigned
квалификатор.
В противном случае вы столкнетесь со следующей проблемой: вы пишете и отлаживаете программу, предполагая, что char
подписан по умолчанию, а затем перекомпилируете если компилятор предполагает иное, и поведение программы резко меняется. Если вы полагаетесь на это предположение только время от времени в своем коде, вы рискуете столкнуться с непреднамеренным поведением в некоторых случаях, которое запускается в вашей программе только при определенных условиях и очень трудно обнаружить и отладить.
Возможно, вы имеете в виду тот факт, что подпись char
зависит от компилятора / платформы. Вот запись в блоге, которая проливает некоторый свет на это:
Наличие знакового символа - это скорее случайность того, как все базовые типы переменных обрабатываются в C, как правило, отрицательные символы на самом деле бесполезны.
знаковый символ всегда 8-битный и всегда имеет знаковый бит в качестве последнего бита.
беззнаковый символ всегда 8-битный и не имеет знакового бита.
char, насколько я знаю, всегда беззнаковый. Любой компилятор, по умолчанию использующий подписанный char, столкнется с множеством несовместимых программ.