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

Почему "char" подписан по умолчанию на С++?

Почему char по умолчанию в диапазоне от -128 до 127, когда он должен представлять "символ", текстовые представления которого находятся в диапазоне от 0 до 255? В этом смысле я бы предположил, что char должен быть неподписанным по умолчанию, только если мы намеревались рассматривать его только как "числа", нам нужно было бы добавить ключевое слово "signed". Поэтому следует ли использовать unsigned char при работе с текстовыми файлами?

Также я не понимаю, почему std::ofstream функции чтения и записи используют char, а не unsigned char, когда мне нужно работать с двоичными файлами. Там меня не интересует подписанность, не так ли? Кроме того, я успешно сделал копию файла JPEG с помощью signed char следующим образом:

//..open all streams..
char c;
while(input.peek()!=EOF){
    input.read(&c,1);   //std::ifstream input;
    output.write(&c,1); //std::ofstream output;
} 
//..close all streams..

Так как он работает, я думаю, что read читает unsigned byte (при обработке изображений unsigned char обычно используется) и устанавливает c, так что значение имеет некоторую случайную подписанную интерпретацию в 2 дополнениях. Мне нужно создать гистограмму значений, но я получаю ошибку времени выполнения, потому что я использую подписанный char как индекс. Разве это не так глупо, что я должен использовать некоторый листинг uc = (unsigned char)c;?, когда может быть как минимум простая перегрузка чтения/записи для unsigned char?

4b9b3361

Ответ 1

Это не так.

Подписанность char, не являющаяся либо signed char, либо unsigned char, определяется реализацией. Многие системы делают его подписанным для соответствия другим типам, которые по умолчанию подписаны (например, int), но могут быть неподписанными в некоторых системах. (Скажем, если вы передадите -funsigned-char в GCC.)

Ответ 2

Вот ваш ответ со стандартом:

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

1 Объекты, объявленные как символы char), должны быть достаточно большими, чтобы хранить любой элемент базового набора символов реализации. Если символ из этого набора сохраняется в символьном объекте, целочисленное значение этого символьного объекта равно значению односимвольной литеральной формы этого символа. Определяется реализация, может ли объект char содержать отрицательные значения. Символы могут быть явно объявлены без знака или подписаны. Обычная char, подписанная char и unsigned char - три различных типа. A char, подписанный char и unsigned char занимают одинаковое количество хранилищ и имеют одинаковые требования к выравниванию (basic.types); то есть они имеют одно и то же представление объекта. Для типов символов в представлении значения участвуют все биты представления объекта. Для неподписанных типов символов все возможные битовые шаблоны представления значений представляют числа. Эти требования не подходят для других типов. В любой конкретной реализации простой объект char может принимать те же значения, что и подписанный char или unsigned char; который определяется реализацией.