我正在研究一个问题,陷入了这个愚蠢的错误,我无法解决。 基本上,我使用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的数字。
问题出在哪里?
答案 0 :(得分:2)
这是由于unsigned
数据类型的环绕。由于它是unsigned
,所以不能为负。因此,求反运算会回绕并产生32位整数的边界值。
替换
unsigned int number = 0;
与
int number = 0;
答案 1 :(得分:2)
如果您的问题陈述指出最终结果number
不会是negative
,则并不意味着中间数字也只会是positive
。因为,可能会有一系列流,其中包含诸如- + +
之类的字符,其结果如:0, -1, 0, 1
。在这里,最终答案是positive
,但中间数字仍然是negative
。
现在,您正在尝试在positive
数据类型中同时保留negative
和unsigned int
个数字,这在上面的示例中导致输出错误。因为,如果number为0
,而您尝试应用否定,则它将为4294967295
(unsigned int类型的变量的最大值)而不是-1
。
因此,您可以按照Kaidul的建议使用unsigned int
数据类型,而不是使用int
数据类型。