我有一个二进制字符串,然后使用atoi()
转换为整数。当我这样做时,它似乎自动将二进制转换为十进制。问题是得到的整数是负数,并不与任何在线二进制到十进制转换器一致。是atoi()
打破了什么?我应该使用不同的功能吗?
代码:
string myString = "01000101";
int x = atoi(myString.c_str());
cout << x;
由于
答案 0 :(得分:23)
atoi
不处理二进制数,它只是将它们解释为大十进制数。你的问题是它太高而你得到一个整数溢出,因为它被解释为十进制数。
解决方案是使用已添加到C ++ 11中的stoi
的{{1}},stol
或stoll
。称他们为
string
int i = std::stoi("01000101", nullptr, 2);
值。int
。std::string
,它会保存第一个非数字字符的索引。size_t *
,对应于将用于转换的基础.. 有关功能的信息,请查看its cppreference page。
请注意,还有一些名称几乎相同的C ++ 11之前的函数,例如:int
与C ++ 11 strtol
相比。
它们也可以用于不同的基础,但是它们不会以相同的方式进行错误处理(当根本不能对给定的字符串进行转换时,它们尤其缺乏,例如尝试将“hello”转换为字符串)和< strong>你应该更喜欢C ++ 11版本。
说实话,将“Hello”传递给stol
和C ++ 11 strtol
会导致:
stol
返回strtol
并且没有给您任何方法将其标识为错误,0
抛出stol
并表示出现了问题。错误地将“Hello”这样的内容解释为整数可能会导致错误,在我看来应该避免。
但为了完整起见,还要链接到its cppreference page。
答案 1 :(得分:4)
听起来你应该使用strtol()
2
作为最后一个参数。