用负值初始化的无符号长long变量

时间:2015-03-04 10:32:19

标签: c++ variables iostream long-integer

用户输入一个值(通过<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;
}

3 个答案:

答案 0 :(得分:3)

你不能,至少不能直接。由于各种历史原因,C ++ 即使输入无符号值,也允许使用减号。最好的你 可以做的是在读取字段之前检查:

input >> std::ws;       //  Skips white space
if ( input.peek() == '-' ) {
    //  Input begins with minus sign...
}
//  Do input.

转换后的值,有关文本的信息 产生它的东西已经丢失了。

答案 1 :(得分:1)

如果您希望用户能够使用unsigned long long的全部范围,那么您有两种选择:

  1. 使用字符串并解析它
  2. 使用更大的(带符号)整数类型(可能是128位整数所需的一些特殊库)
  3. 否则你可以只处理变量,就好像它是一个有符号的long long并测试最重要的位(或暂时转换它并执行&#34;正常&#34;比较)。

答案 2 :(得分:0)

cin期望未签名的号码时输入一个负数将设置流的失败状态,您可以cin.fail()查询。

但是,输入大于ULLONG_MAX的数字也会设置失败状态,因此您无法通过检查cin.fail()来确定用户输入的值是太小还是太大。

如果您只想检测负输入,那么您需要使用字符串作为辅助变量,如UniversE所述。