Несовместимая арифметика с символами в C ++?

Я просто играл с персонажами, используя очень простую программу на C ++, позвольте мне объяснить ситуацию:

#include<iostream>

int main(){

char c;
std :: cin >> c;
std :: cout << "The integer value of character entered is : " <<  int(c) << '\n';

int m = 12 + 'á';

std :: cout << m << '\n';

return 0;
}

теперь, когда я выполняю вышеупомянутую программу, я ввожу значение c как ‘á’, которое находится в наборе символов испанского языка и типизируется как «Alt + 160» в окнах, и потому что мой компьютер реализует простой старый символ как знак со знаком выше Программа выводит целое значение ‘á’ как -96, но странная вещь случается, когда я выводю значение m, она возвращает вывод как -19 вместо -84, тогда как если я выполняю следующую программу -:

#include<iostream>

int main(){

signed char c;
std :: cin >> c;
std :: cout << "The integer value of character entered is : " <<  int(c) << '\n';

int m = 12 + c;

std :: cout << m << "\n";

return 0;
}

Я получаю правильное выходное значение, теперь я не понимаю, почему это происходит, если каждый символ поддерживается каким-либо числом в компьютере, тогда почему выражение m = 12 + ‘á’ не оценивается как m = 12 + (- 96). Пожалуйста, просветите меня по этому вопросу. Я использую Windows 7 и Dev C ++

1

Решение

Я только что сказал, что 160 не код для á… ну, я был неправ, это так, в кодовой странице CP437 или DOS. В кодовой странице Windows (CP1252) á 225, но, видимо, Windows не использует кодовую страницу Windows в консоли.

Ваш редактор может использовать или не использовать CP437, CP1252, UTF8 или что-либо еще. Посмотрите на вашу программу в шестнадцатеричном редакторе, чтобы быть уверенным. Более того, никогда не используйте ничего, кроме простого 7-битного ASCII в тексте вашей программы, особенно в Windows, но в целом и везде. Эти вещи не переносимы даже между разными компьютерами, на которых установлена ​​одна и та же версия одной и той же ОС, и не допускаются стандартом. Они придут и укусят вас. Если вам нужны строки символов не ASCII в вашей программе, прочитайте их из файла данных, никогда не вставляйте их в исходный код.

Когда вы работаете с текстом в вашей программе, всегда проверяйте правильность кодировки. Это НЕ просто, особенно в Windows, когда используется Visual Studio и стандартные библиотеки ввода-вывода C и / или C ++. Я не смог заставить эту комбинацию работать с UTF-8.

2

Другие решения

Других решений пока нет …