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