atoi
nie obsługuje liczb binarnych, po prostu interpretuje je jako duże liczby dziesiętne. Twoim problemem jest to, że jest zbyt wysoki i otrzymujesz przepełnienie liczby całkowitej, ponieważ jest interpretowane jako liczba dziesiętna.
Rozwiązaniem byłoby użyć stoi
, stol
lub stoll
który został dodany do string
C++ 11. Zadzwoń do nich jak
int i = std::stoi("01000101", nullptr, 2);
- Zwrócona wartość jest konwertowane wartość
int
.
- Pierwszy argument to
std::string
, który chcesz przekonwertować.
- Drugi to
size_t *
, w którym zapisze indeks pierwszej cyfry niepustej.
- Trzeci jest
int
który odpowiada podstawy, że będzie stosowana do konwersji ..
Aby uzyskać więcej informacji na temat funkcji spojrzeć na its cppreference page.
pamiętać, że istnieją również pre C++ 11 działa z prawie takiej samej nazwie, jak np: strtol
porównaniu do C++ 11 stol
.
Działają również w różnych bazach, ale nie obsługują błędów w ten sam sposób (szczególnie brakuje im możliwości konwersji w danym ciągu znaków, np. Próby przekonwertowania "hello" na ciąg znaków) i prawdopodobnie powinieneś preferować wersje C++ 11.
aby mój punkt, przechodząc „Hello” zarówno strtol
i C++ 11 stol
doprowadziłoby do:
strtol
zwrotów 0
i nie daje żadnych sposób, aby zidentyfikować go jako błędu,
stol
z C++ 11 rzuca std::invalid_argument
i wskazuje, że coś jest nie tak.
Fałszywe interpretowanie czegoś takiego jak "Witaj" jako liczby całkowite może prowadzić do błędów i należy ich unikać w mojej opinii.
Ale dla kompletności sake również link do its cppreference page.
Co dokładnie masz na myśli przez * ciąg znaków binarnych *? Coś jak "10001" ', które musisz przekonwertować na' 17'? – NPE
Ya, właśnie edytowałem to, aby było nieco bardziej jasne – SkippyNBS
'atoi()' traktuje ciąg wejściowy jako dziesiętny; możesz użyć 'strtol()' (lub jednego z jego krewnych) z '2' jako podstawą do uzyskania binarnego. –