在for循环中返回一个大数字

时间:2019-05-12 19:29:16

标签: c++ algorithm

我正在研究一个问题,陷入了这个愚蠢的错误,我无法解决。 基本上,我使用for循环并从流中读取字符。当字符为“-”时,我将整数减一,而当字符为“ +”时,我将其减一。 我使用无符号整数,因为我不想要负数。这是代码示例:

char x;
unsigned int number = 0;
for (int i = 0; i < n; i++){
    cin >> x;
    if (x == '-'){
        number--;
    }else if (x == '+'){
        number++;
    }
}
cout << number;

它显示了一些类似于4294967293的数字。

问题出在哪里?

2 个答案:

答案 0 :(得分:2)

这是由于unsigned数据类型的环绕。由于它是unsigned,所以不能为负。因此,求反运算会回绕并产生32位整数的边界值。

替换

unsigned int number = 0;

int number = 0;

答案 1 :(得分:2)

如果您的问题陈述指出最终结果number不会是negative,则并不意味着中间数字也只会是positive。因为,可能会有一系列流,其中包含诸如- + +之类的字符,其结果如:0, -1, 0, 1。在这里,最终答案是positive,但中间数字仍然是negative

现在,您正在尝试在positive数据类型中同时保留negativeunsigned int个数字,这在上面的示例中导致输出错误。因为,如果number为0,而您尝试应用否定,则它将为4294967295(unsigned int类型的变量的最大值)而不是-1

因此,您可以按照Kaidul的建议使用unsigned int数据类型,而不是使用int数据类型。