Страницы

Поиск по вопросам

среда, 18 декабря 2019 г.

Таблица ASCII и её соответствие в c++

#cpp #ascii


Почему в таблице ASCII российская буква 'a' равна 160, а когда я пишу: 

int a = 'а';

cout << a << endl;


мне выводит -32?
    


Ответы

Ответ 1



Результат выполнения Вашего кода зависит от нескольких факторов. В частности от кодировки исходника, используемого компилятора и правил кодирования символьных и строковых литералов. Например, возможен вариант вывода числа 53424 и предупреждения: multi-character character constant [-Wmultichar] при использовании UTF-8 кодировки исходника и компилятора gcc. Т.о. 'а' это вовсе и не символ, а целое число (более подробно о мультисимвольных литералах можно почитать тут), в чем можно убедиться проверкой sizeof, которая вернет такое же значение, как и для int, а не для char (по определению 1). При использовании clang вообще получим ошибку компиляции: character too large for enclosing character literal type Чтобы избавиться от такой ошибки придется изменить тип символьного литерала (например на wchar_t, задав префикс L). В этом случае на выводе получим уже другое число: 1072, что соответствует UTF-16 коду русской буквы а. Чтобы получить такой же результат как у Вас, но с помощью онлайн-компилятора gcc можно использовать ключ -fexec-charset с кодовой страницей 1251. При этом, хочу заметить, что для буквы а код 160 (0xA0) соответствует кодировке cp866, а не cp1251, в которой он равен 224 (0xE0). Поэтому -32 в 160 превратиться не сможет путем обычного преобразования знакового числа в беззнаковое. Если уж очень хочется получить на выводе именно 160 помимо преобразования в беззнаковый тип надо ещё использовать кодовую страницу cp866. Т.е. собирать следующий код с ключом -fexec-charset=cp866: #include int main() { int a = static_cast('а'); std::cout << a << std::endl; }

Ответ 2



Потому что число больше 127 не влезает в знаковый char, у которого диапазон от -128 до 127. Зато влезает в беззнаковый, но, судя по всему, на вашей системе char является знаковым, поэтому происходит конвертация из знакового char в знаковый int. Т.к. любое число char всегда влазит в int, то получается, что в int попадает отрицательное число из char Чтобы получить положительное число, просто используйте любой unsigned тип в качестве приёмника значения, а исходный char преобразуйте к unsigned char: unsigned int a = static_cast('а');

Комментариев нет:

Отправить комментарий