Двоичная строка в целое с помощью 'atoi ()'

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

Код:

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

Спасибо


person SkippyNBS    schedule 11.05.2014    source источник
comment
Что именно вы подразумеваете под бинарной строкой? Что-то вроде "10001", которое нужно преобразовать в 17?   -  person NPE    schedule 11.05.2014
comment
Да, я просто отредактировал это, чтобы сделать его более понятным   -  person SkippyNBS    schedule 11.05.2014
comment
atoi() обрабатывает входную строку как десятичную; вы можете использовать strtol() (или один из его родственников) с 2 в качестве базы для получения двоичного кода.   -  person Jonathan Leffler    schedule 11.05.2014
comment
@JonathanLeffler stol следует использовать в настоящее время (если у вас есть C ++ 11), на мой взгляд, он стал лучше обрабатывать ошибки. Например, передача чего-то вроде hello в strtol вернет 0 передача его в C++11 stol выдаст std::invalid_argument. Интерпретация Hello как 0 может привести к множеству ошибок.   -  person user1942027    schedule 11.05.2014
comment
Справедливо. strtol() сообщает об ошибках окольными путями и, по сути, не должен вызываться напрямую, если вы серьезно относитесь к обнаружению ошибок. Вы бы обернули его в функцию, которая выявляет ошибки, которые вас интересуют, и сообщает о них соответствующим образом. Его можно использовать, когда вы не слишком возражаете против обработки ошибок. GIGO (мусор на входе, мусор на выходе) по-прежнему действует; вы можете или не можете захотеть обнаружить часть GI, если часть GO не нанесет большого ущерба. Одним из преимуществ strtol() является то, что он создан на C и всегда доступен — он не зависит от C++11. Важно ли это, зависит от контекста.   -  person Jonathan Leffler    schedule 12.05.2014


Ответы (2)


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

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

person NPE    schedule 11.05.2014
comment
Поскольку это принятый ответ, я просто добавлю, что, по моему мнению, версии С++ 11 для преобразования строк в целые числа лучше, когда дело доходит до обработки ошибок (и strtol не следует использовать). Дополнительная информация внизу моего ответа. - person user1942027; 12.05.2014