用负值初始化的 unsigned long long 变量
Unsigned long long variable initialized with negative value
用户输入一个值(通过<iostream>
)到unsigned long long变量。我如何检测输入变量是否为负数?输入流保持 good()
状态。我可以不使用额外的 string
变量吗?
unsigned long long SafeInput(){
unsigned long long buffer = 0;
while (!(cin >> buffer) || cin.get() != '\n')
{
cout << "Error. Input again: ";
cin.clear();
cin.sync();
}
return buffer;
}
如果你想让用户能够使用unsigned long long
的全系列,那么你有两个选择:
- 使用字符串并解析它
- 使用更大的(有符号的)整数类型(可能需要一些特殊的库来处理 128 位整数)
否则,您可以将变量视为带符号的 long long
并测试最高有效位(或临时转换并执行 "normal" 比较)。
你不能,至少不能直接。由于各种历史原因,C++
即使在输入无符号值时也允许减号。最好的你
可以做的是在读取字段之前检查:
input >> std::ws; // Skips white space
if ( input.peek() == '-' ) {
// Input begins with minus sign...
}
// Do input.
转换值后,有关文本的信息
生成它的人已经丢失了。
当 cin
期望无符号数时输入负数将设置流的失败状态,您可以通过 cin.fail()
.
查询
但输入大于ULLONG_MAX
的数字也会设置失败状态,所以无法通过cin.fail()
判断用户输入的值是过小还是过大。
如果只想检测负输入,则需要使用字符串作为辅助变量,如UniversE所述。
用户输入一个值(通过<iostream>
)到unsigned long long变量。我如何检测输入变量是否为负数?输入流保持 good()
状态。我可以不使用额外的 string
变量吗?
unsigned long long SafeInput(){
unsigned long long buffer = 0;
while (!(cin >> buffer) || cin.get() != '\n')
{
cout << "Error. Input again: ";
cin.clear();
cin.sync();
}
return buffer;
}
如果你想让用户能够使用unsigned long long
的全系列,那么你有两个选择:
- 使用字符串并解析它
- 使用更大的(有符号的)整数类型(可能需要一些特殊的库来处理 128 位整数)
否则,您可以将变量视为带符号的 long long
并测试最高有效位(或临时转换并执行 "normal" 比较)。
你不能,至少不能直接。由于各种历史原因,C++ 即使在输入无符号值时也允许减号。最好的你 可以做的是在读取字段之前检查:
input >> std::ws; // Skips white space
if ( input.peek() == '-' ) {
// Input begins with minus sign...
}
// Do input.
转换值后,有关文本的信息 生成它的人已经丢失了。
当 cin
期望无符号数时输入负数将设置流的失败状态,您可以通过 cin.fail()
.
但输入大于ULLONG_MAX
的数字也会设置失败状态,所以无法通过cin.fail()
判断用户输入的值是过小还是过大。
如果只想检测负输入,则需要使用字符串作为辅助变量,如UniversE所述。