为什么我总是要除以49才能得到二进制转换器+cout模糊度的正确答案? 最近我开始学习C++,如果我犯了一个愚蠢的错误,那么抱歉…为什么我必须除以49才能得到正确答案?例如,如果我输入1111,那么答案是735而不是15

为什么我总是要除以49才能得到二进制转换器+cout模糊度的正确答案? 最近我开始学习C++,如果我犯了一个愚蠢的错误,那么抱歉…为什么我必须除以49才能得到正确答案?例如,如果我输入1111,那么答案是735而不是15,c++,visual-c++,C++,Visual C++,所有数字都会出现这种情况,例如,如果我输入10,则答案是98而不是2。还有,为什么我的沙发上显示的值不明确?我正在使用Visual Studio 2013。注意,被49除法发生在最后一行 void binaryToDecimal() { string number = getNumber(); int sum = 0; int factor = 1; for (int i = number.length() - 1; i >= 0; i--) { if (number.at(i)

所有数字都会出现这种情况,例如,如果我输入10,则答案是98而不是2。还有,为什么我的沙发上显示的值不明确?我正在使用Visual Studio 2013。注意,被49除法发生在最后一行

void binaryToDecimal() {
string number = getNumber();
int sum = 0;
int factor = 1;
for (int i = number.length() - 1; i >= 0; i--) {
    if (number.at(i) != '0' && number.at(i) != '1') {
        cout << "Number is not in binary form" << endl;
        system("pause");
        exit(1);
    }
    if (number.at(i) == '1') {
        sum += number.at(i) * factor;
    }
    factor *= 2;
}
cout << "\'" << number << "\' in binary is \'" << sum / 49 << "\'" << endl;
}
字符串中的字符存储在内部,与int不同。希望这个小代码片段能帮助您更好地理解这个神奇的数字

#include <iostream>
#include <string>

using namespace std;

int main(void){

    std::string test("1234");
    for(size_t i = 0; i < test.size(); i++){
        std::cout << static_cast<int>(test.at(i)) << std::endl;
    }

    return 0;
}
特别注意,将字符串1转换为int的值是49

要避免这种神奇数字方法,您可能需要做以下两件事之一:

使用诸如boost::lexical_cast或“stringstream”之类的字符串到int的转换,首先将字符串转换为整数表示,然后再进行处理。但是,这会改变逻辑,因为您现在正在使用一些不同的数学

或者,如果您希望保持逻辑基本相同,那么最简单的事情就是,一旦您通过输入阶段,就不要在内部处理字符:

using namespace std;

bool binaryToDecimal() {
    string raw_input("101");//This would be your get_number function
    int sum = 0;
    int factor = 1;
    for (size_t i = raw_input.length()-1; i > 0; i--) { //I think you also had an off by one error here
        if (raw_input.at(i) != '0' && raw_input.at(i) != '1') {
            cout << "Number is not in binary form" << endl;
            return false;
        }
        if (raw_input.at(i) == '1') {
            sum += factor; //Previously you had a completely unnecessary number.at(i) in here
        }
        factor *= 2;
    }
    cout << "\'" << raw_input << "\' in binary is \'" << sum << "\'" << endl; //No more magic number required now!
    return true;
}
字符串中的字符存储在内部,与int不同。希望这个小代码片段能帮助您更好地理解这个神奇的数字

#include <iostream>
#include <string>

using namespace std;

int main(void){

    std::string test("1234");
    for(size_t i = 0; i < test.size(); i++){
        std::cout << static_cast<int>(test.at(i)) << std::endl;
    }

    return 0;
}
特别注意,将字符串1转换为int的值是49

要避免这种神奇数字方法,您可能需要做以下两件事之一:

使用诸如boost::lexical_cast或“stringstream”之类的字符串到int的转换,首先将字符串转换为整数表示,然后再进行处理。但是,这会改变逻辑,因为您现在正在使用一些不同的数学

或者,如果您希望保持逻辑基本相同,那么最简单的事情就是,一旦您通过输入阶段,就不要在内部处理字符:

using namespace std;

bool binaryToDecimal() {
    string raw_input("101");//This would be your get_number function
    int sum = 0;
    int factor = 1;
    for (size_t i = raw_input.length()-1; i > 0; i--) { //I think you also had an off by one error here
        if (raw_input.at(i) != '0' && raw_input.at(i) != '1') {
            cout << "Number is not in binary form" << endl;
            return false;
        }
        if (raw_input.at(i) == '1') {
            sum += factor; //Previously you had a completely unnecessary number.at(i) in here
        }
        factor *= 2;
    }
    cout << "\'" << raw_input << "\' in binary is \'" << sum << "\'" << endl; //No more magic number required now!
    return true;
}

ASCII中的数字被分配到代码点0x30-0x39或48-57。当你用“1”乘以某物时,当然它的结果中总是包含“1”一词,即49。需要通过从字符中减去“0”将“0”和“1”转换为整数值


此外,无需乘法,只需从左向右读取字符串并移位,速度会快得多

ASCII中的数字被分配到代码点0x30-0x39或48-57。当你用“1”乘以某物时,当然它的结果中总是包含“1”一词,即49。需要通过从字符中减去“0”将“0”和“1”转换为整数值


另外,不需要乘法,只需从左到右读取字符串并移位,速度会快得多

为什么要用这种方式编写函数?如果你解释一下你想用这种方法实现什么,你会得到更高质量的响应。你是否混淆了数字字符值和它们的数字等价物??@πάνταῥεῖ 是的,很明显。那么,为什么不写一个答案呢?@KonradRudolph太懒了。你现在有没有看钟??!轮到你了……你为什么要这样写函数?如果你解释一下你想用它来实现什么,你会得到更高质量的响应。你是否混淆了数字字符值和它们的数字等价物??@πάνταῥεῖ 是的,很明显。那么,为什么不写一个答案呢?@KonradRudolph太懒了。你现在有没有看钟??!轮到你了…谢谢,我知道你想说什么了,但是有没有什么方法可以让我不需要除以49呢?在java中,我可以把整数。PARSEINT转换成一个字符串,一个int,C++中有什么类似的东西吗?@ USS3262003,我认为处理它的最好方法是用不同的方式来处理这个问题。如果你愿意的话,我可以把代码包括进来。那太好了:@user3262003,我通过答案更新了。谢谢,我知道你想说什么,但是有什么方法可以让我不需要除以49吗?在java中,我可以把整数。PARSEINT转换成一个字符串,一个int,C++中有什么类似的东西吗?@ USS3262003,我认为处理它的最好方法是用不同的方式来处理这个问题。如果你愿意的话,我可以把代码包括进来,这样做很好:@user3262003,我通过答案更新了。