Символ является 8-битным целым типом. Он имеет специальное свойство, которое при печати будет отображаться как символ, соответствующий значению ASCII, которое он содержит.
Например:
int valueAsInt = 65;
char valueAsChar = valueAsInt;
std::cout << valueAsChar << "\n";
valueAsInt = 'A';
std::cout << valueAsInt << "\n";
A
65
Примите значение символьного литерала '0'. Это соответствует значению ASCII 48. «1» равно 49 и т. Д.
Если вы вычтите 48 из 49, вы получите 1. Но это не то, что вы ищете.
Значение ASCII 1 соответствует непечатному символу, называемому «начало заголовка». Когда-то он использовался на старых принтерах в качестве разметки. Он не печатает, но изменяет способ печати дальнейших символов.
Когда вы вычитаете один числовой символ из другого, вы получаете дельту, а не печатный символ. Чтобы превратить эту дельту обратно в печатный символ, вы должны добавить его к базовому символу:
char value = '5' - '3';
value += '0';
std::cout << "5 - 3 = " << value << "\n";
5 - 3 = 2
Итак, ваш код, такой как message[0] - myTempString[0]
, должен быть изменен на message[0] - myTempString[0] + '0'
, чтобы работать так, как вы намереваетесь.