Двоичная строка в целое число с ' atoi ()'

у меня есть строка двоичного кода, которую я затем преобразую в целое число, используя atoi(). Когда я это делаю, кажется, что автоматически преобразует двоичный код в десятичный. Проблема в том, что полученное целое число отрицательно и не согласуется ни с одним из онлайн-преобразователей двоичного в десятичный. Что-то сломано с atoi()? Я должен использовать другую функцию?

код:

string myString = "01000101";
int x = atoi(myString.c_str());
cout << x;

спасибо

2 ответов


atoi не обрабатывает двоичные числа, он просто интерпретирует их как большие десятичные числа. Ваша проблема в том, что она слишком высока, и вы получаете переполнение целого числа из-за того, что оно интерпретируется как десятичное число.

решение было бы использовать stoi, stol или stoll, что в string в C++11. Называйте их как

int i = std::stoi("01000101", nullptr, 2);
  • возвращаемое значение является преобразованным int значение.
  • первый аргумент -std::string вы хотите превращать.
  • второй -size_t * где он сохранит индекс первого не значного символа.
  • третья int это соответствует базе, которая будет использоваться для преобразования..

для получения информации о функциях смотрите на страница cppreference.


обратите внимание, что есть также функции pre c++11 с почти тем же именем, как пример:strtol по сравнению с C++11 stol.
Они также работают для разных баз, но они не выполняют обработку ошибок одинаковым образом (их особенно не хватает, когда никакое преобразование не может быть сделано на данной строке вообще e.G пытается преобразовать "hello" в строку) и вы, вероятно, должны предпочесть версии C++11.

чтобы сделать мою точку зрения, передавая "привет" и strtol и C++11 stol приведет к:

  • strtol возвращает 0 и не дает вам способ определить его как ошибку,
  • stol из C++11 бросков std::invalid_argument и указывает, что что-то не так.

ложная интерпретация чего-то вроде "Привет" как целых чисел может привести к ошибкам и, на мой взгляд, следует избегать.

но для полноты картины ссылка страница cppreference тоже.


похоже, вы должны использовать strtol() С 2 в качестве последнего аргумента.