用负值初始化的 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的全系列,那么你有两个选择:

  1. 使用字符串并解析它
  2. 使用更大的(有符号的)整数类型(可能需要一些特殊的库来处理 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所述。