Вычитание '0'
волшебным образом не превращает символ в строке в целое число.
Вычитая '0'
, вы вычитаете из значения ASCII, чтобы получить смещение из ASCII 0:
'0' - '0' = 0x30 - 0x30 = 0
'1' - '0' = 0x31 - 0x30 = 1
'2' - '0' = 0x32 - 0x30 = 2
'3' - '0' = 0x33 - 0x30 = 3
...
'9' - '1' = 0x39 - 0x30 = 9
Однако, если у вас есть данные для мусора (которые при вводе пользователем, вы всегда должны предполагать, что они есть), вы получите результаты для мусора:
'-' - '0' = 0x2d - 0x30 = -3
' ' - '0' = 0x20 - 0x30 = -16
'\0' - '0' = 0x00 - 0x30 = -48 (string terminator)
'\n' - '0' = 0x0a - 0x30 = -38
В стандартной библиотеке C / C ++ есть многоинструменты, написанные, чтобы сделать это для нас.
Не беспокойтесь о разборе ASCII, если вы не АБСОЛЮТНО знаете, что делаете.
Для одного числа я предлагаю strtoll
для строк C и stoll
для std::strings
или для нескольких чисел в одной строке sscanf
и istringstream
.
Они обрабатывают шестнадцатеричные, отрицательные, восьмеричные, лишние пробелы и обрабатывают ошибки, если вы используете его правильно, и намного, намного, намного проще, чем ручной анализ.