atoi
не обрабатывает двоичные числа, он просто интерпретирует их как большие десятичные числа. Ваша проблема в том, что он слишком высок, и вы получаете целочисленное переполнение из-за того, что оно интерпретируется как десятичное число.
Решением будет использование stoi
, stol
или stoll
, которые были добавлены к string
в C++11. Назовите их как
int i = std::stoi("01000101", nullptr, 2);
- Возвращаемое значение представляет собой преобразованное значение
int
.
- Первый аргумент — это число
std::string
, которое вы хотите преобразовать.
- Второй - это
size_t *
, где он сохранит индекс первого нецифрового символа.
- Третий —
int
, который соответствует базе, которая будет использоваться для конвертации.
Информацию о функциях см. на странице cppreference.
Обратите внимание, что есть также функции до C++11 с почти такими же именами, например: strtol
по сравнению с C++11 stol
.
Они также работают для разных баз, но они не выполняют обработку ошибок. точно так же (особенно их не хватает, когда для данной строки вообще нельзя выполнить преобразование, например, пытаться преобразовать "hello" в строку), и вероятно, вам следует предпочесть версии C++11.
Чтобы подчеркнуть мою точку зрения, передача «Hello» как strtol
, так и C++11 stol
приведет к:
strtol
возвращает 0
и не дает вам возможности идентифицировать это как ошибку,
stol
из C++11 выдает std::invalid_argument
и указывает, что что-то не так.
Ложная интерпретация чего-то вроде «Hello» как целых чисел может привести к ошибкам, и, на мой взгляд, этого следует избегать.
Но для полноты картины дайте также ссылку на его страницу cppreference.
person
user1942027
schedule
11.05.2014
"10001"
, которое нужно преобразовать в17
? - person NPE   schedule 11.05.2014atoi()
обрабатывает входную строку как десятичную; вы можете использоватьstrtol()
(или один из его родственников) с2
в качестве базы для получения двоичного кода. - person Jonathan Leffler   schedule 11.05.2014stol
следует использовать в настоящее время (если у вас есть C ++ 11), на мой взгляд, он стал лучше обрабатывать ошибки. Например, передача чего-то вроде hello вstrtol
вернет0
передача его в C++11stol
выдастstd::invalid_argument
. Интерпретация Hello как0
может привести к множеству ошибок. - person user1942027   schedule 11.05.2014strtol()
сообщает об ошибках окольными путями и, по сути, не должен вызываться напрямую, если вы серьезно относитесь к обнаружению ошибок. Вы бы обернули его в функцию, которая выявляет ошибки, которые вас интересуют, и сообщает о них соответствующим образом. Его можно использовать, когда вы не слишком возражаете против обработки ошибок. GIGO (мусор на входе, мусор на выходе) по-прежнему действует; вы можете или не можете захотеть обнаружить часть GI, если часть GO не нанесет большого ущерба. Одним из преимуществstrtol()
является то, что он создан на C и всегда доступен — он не зависит от C++11. Важно ли это, зависит от контекста. - person Jonathan Leffler   schedule 12.05.2014