Подтвердить что ты не робот

При каких обстоятельствах можно использовать подписанный char в С++?

В большинстве ситуаций объявляется объект char для назначения одного из символов в таблице ascii в диапазоне от 0 до 127. Даже расширенные наборы символов варьируются от 128 до 255 (все еще положительно). Поэтому я предполагаю, что при работе с печатью символов нужно использовать unsigned char.

Теперь, основываясь на некоторых исследованиях SO, люди используют signed char, когда им нужно использовать действительно маленькие целые числа, но для этого мы можем использовать тип [u]int8. Поэтому у меня возникли проблемы с пониманием того, почему нужно использовать signed char? Вы можете использовать его, если вы имеете дело с базовым символом таблицы ascii (который unsigned char уже способен выполнить), или вы можете использовать его для представления небольших целых чисел (которые [u]int8 уже заботится).

Может ли кто-нибудь указать пример программирования, в котором signed char предпочтительнее других типов?

4b9b3361

Ответ 1

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

Если вы хотите сохранить отрицательные значения в переменной типа char, вы обязательно должны объявить ее как signed char, потому что только тогда вы можете быть уверены, что каждая платформа сможет хранить в ней отрицательные значения. Да, вы можете использовать тип [u]int8, но это не всегда так (оно было введено только в С++ 11), и на самом деле int8 скорее всего является псевдонимом для signed char.

Кроме того, uint8_t и int8_t определяются как необязательные типы, то есть вы не можете всегда полагаться на его существование (в отличие от signed char). В частности, если машина имеет байтовый блок с более чем 8 битами, маловероятно, что uint8_t и int8_t определены (хотя они могут: компилятор всегда может предоставить его и выполнить соответствующие вычисления), См. Этот родственный вопрос: Что такое int8_t, если машина имеет > 8 бит на байт?

Ответ 2

Является ли char подписанным или неподписанным?

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

§ 3.9.1 - Основные типы - [basic.fundamental]

1 Объекты, объявленные как символы (char), должны быть достаточно большими, чтобы хранить любой элемент базового набора символов реализации. Если символ из этого набора сохраняется в символьном объекте, целочисленное значение этого символьного объекта равно значению односимвольной литеральной формы этого символа. Определяется реализацией, может ли объект char содержать отрицательные значения.


Я хотел бы использовать наименьший тип целого числа со знаком, какой он есть?

С++ 11 представил несколько фиксированных целых типов, но общее недоразумение в том, что эти типы гарантированно доступны, что не соответствует .

§ 18.4.1 - Контраст <cstdint> - [cstdint.syn]

typedef signed integer type int8_t; // optional

Чтобы сохранить место в этом сообщении, большая часть раздела была опущена, но необязательное обоснование применяется ко всем типам {,u}int{8,16,32,64}_t. Для их реализации требуется не.


Стандартные мандаты, доступные int_least8_t, но, как видно из названия, этот тип гарантированно имеет ширину равную или большую, чем 8 бит.

Однако стандарт гарантирует, что даже если signed char, char и unsigned char являются тремя различными типами [1] они должны занимать одинаковый объем памяти и иметь одинаковое выравнивание требования.

После проверки стандарта далее мы также обнаружим, что sizeof(char) гарантировано как 1 [2] что означает, что этот тип гарантированно занять наименьшее количество пространства, которое С++-переменная может занимать в рамках данной реализации.


Заключение

Помните, что unsigned char и signed char должны занимать тот же объем памяти, что и char?

Наименьший тип целочисленного знака, который гарантированно доступен, поэтому signed char.



[ примечание 1]

§ 3.9.1 - Основные типы - [basic.fundamental]

1 Равнина char, signed char и unsigned char являются тремя различными типами, которые в совокупности называются узкими типами символов.

     

A char, a signed char и a unsigned char занимают одинаковое количество хранения и имеют те же требования к выравниванию (3.11); то есть они имеют одно и то же представление объекта. Для узких типов символов в представлении значения участвуют все биты представления объекта.

[ примечание 2]

§ 5.3.3 - Размер - [expr.sizeof]

sizeof(char), sizeof(signed char) и sizeof(unsigned char) равны 1.

     

Результат sizeof, примененный к любому другому фундаментальному типу (3.9.1), определяется реализацией.

Ответ 3

Вы можете использовать char для арифметических операций с малыми целыми числами. unsigned char даст вам больший диапазон, а signed char даст вам меньший абсолютный диапазон и способность работать с отрицательными числами.

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