我有以下用 C++ 编写的程序:
这个程序的问题是,如果用户输入一个负数,它不会被 line 捕获if(!cin)
。我认为无符号整数不能接受负数。那么为什么如果我输入一个负数来调整大小,它不会被捕获if(!cin)
并且程序继续执行而没有错误消息?
我无法使用if(size < 0)
. 我想展示无符号整数如何解决负输入问题。
大多数平台上无符号整数和有符号整数之间的区别是符号位......除此之外,实际的二进制值是相同的,它只是根据二进制值所代表的类型的符号来解释两种不同的方式. 因此,您绝对可以将负值输入“表示”为无符号值......它不会被重新解释为该值,但它绝对可以作为该值输入,而不会在流上设置错误。
不是 c++ 大师或其他任何东西,但您是否尝试过使用而不是 !cin 并通过更深入的解释cin.fail()
清除缓冲区cin.clear()
C 和 C++ 允许您将负值分配给无符号类型的对象。结果是原始值减少模2^n
,其中n
是无符号类型的大小。因此,例如,unsigned i = -1;
初始化i
为UINT_MAX
.
检查 if(!cin)
只会表明没有读取任何内容,例如文件结尾。
整数unsigned
不会强制输入为正数;它只是意味着该值将始终被解释为正数(请参见符号位),如果该数字实际上是负数,这可能会产生巨大的影响。
您最好的选择可能是输入一个有符号整数,然后在您的代码中测试它是否为正。
如果您想阻止用户输入负数,请将输入作为有符号数并检查它是否等于或大于零。
该标准基本上说,当您尝试将数字分配给超出类型范围的整数类型时,将添加或减去类型大小的倍数,直到该值在范围内。
碰巧的是,对于表示为 2-s 补码并在有符号和无符号整数范围内的值,这意味着完全相同的位模式将分配给任何值。负 1 具有全为 1 的位模式,它转换为 unsigned int 的最高可能值,等于或原始值加上 unsigned int 的大小。-1 + 232
或者您可以只使用更大的有符号整数类型。
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;
}