3

我有以下用 C++ 编写的程序:

这个程序的问题是,如果用户输入一个负数,它不会被 line 捕获if(!cin)。我认为无符号整数不能接受负数。那么为什么如果我输入一个负数来调整大小,它不会被捕获if(!cin)并且程序继续执行而没有错误消息?

我无法使用if(size < 0). 我想展示无符号整数如何解决负输入问题。

4

6 回答 6

2

大多数平台上无符号整数和有符号整数之间的区别是符号位......除此之外,实际的二进制值是相同的,它只是根据二进制值所代表的类型的符号来解释两种不同的方式. 因此,您绝对可以将负值输入“表示”为无符号值......它不会被重新解释为该值,但它绝对可以作为该值输入,而不会在流上设置错误。

于 2012-10-18T15:53:46.403 回答
1

不是 c++ 大师或其他任何东西,但您是否尝试过使用而不是 !cin 并通过更深入的解释cin.fail()清除缓冲区cin.clear()

于 2012-10-18T15:55:46.030 回答
0

C 和 C++ 允许您将负值分配给无符号类型的对象。结果是原始值减少模2^n,其中n是无符号类型的大小。因此,例如,unsigned i = -1;初始化iUINT_MAX.

于 2012-10-18T15:54:54.650 回答
0

检查 if(!cin)只会表明没有读取任何内容,例如文件结尾。

整数unsigned不会强制输入为正数;它只是意味着该值将始终被解释为正数(请参见符号位),如果该数字实际上是负数,这可能会产生巨大的影响。

您最好的选择可能是输入一个有符号整数,然后在您的代码中测试它是否为正。

于 2012-10-18T15:55:21.707 回答
0

如果您想阻止用户输入负数,请将输入作为有符号数并检查它是否等于或大于零。

该标准基本上说,当您尝试将数字分配给超出类型范围的整数类型时,将添加或减去类型大小的倍数,直到该值在范围内。

碰巧的是,对于表示为 2-s 补码并在有符号和无符号整数范围内的值,这意味着完全相同的位模式将分配给任何值。负 1 具有全为 1 的位模式,它转换为 unsigned int 的最高可能值,等于或原始值加上 unsigned int 的大小。-1 + 232

于 2012-10-18T15:57:28.680 回答
0

或者您可以只使用更大的有符号整数类型。

long long n = -1;
cout << "Enter a number: ";
cin >> n;

if( !cin.good() )
    cout << "Not a valid number." << endl;
else if( n > UINT_MAX )
    cout << "Overflow, value is more than UINT_MAX." << endl;
else if( n < 0 )
    cout << "Negative, value is less than 0." << endl;
else {
    unsigned int m = (unsigned int)n;
    cout << "Valid unsigned int was input: " << m << "." << endl;
}
于 2012-10-18T18:03:12.430 回答