Двоичная строка в целое число с ' 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
в качестве последнего аргумента.