2013-05-05 1 views
1

я просто играл с символами, используя очень простой 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; 
} 

теперь, когда я исполняю выше программы я ввожу значение с как «», который находится в spanish character set и набирается как «Alt + 160» в Windows, и поскольку мой компьютер реализует простой старый символ в качестве подписанного символа, вышеуказанная программа выводит целочисленное значение «á» как -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++

+2

На многих системах 'á' представлен в [UTF-8] (http://en.wikipedia.org/wiki/UTF-8) на * two * bytes .... –

+1

что вы получаете с 'cout << (int) ('á');'? –

+0

@ArneMertz: Я получаю значение -31 как значение – AnkitSablok

ответ

2

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

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

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