检查无符号长long

时间:2017-11-05 15:06:54

标签: c scanf unsigned-long-long-int

我需要检查一下,如果输入正确,就像丢弃一些错误的输入,比如'b',-2等。继承我的简单代码,如何检查它:

#include <stdio.h>

int main()
{
    unsigned long long bigNumber;
    if(scanf("%llu", &bigNumber) == 0)
        printf("Input error!");
    else
        printf("%llu\n", bigNumber);

    return 0;
}

但是当我输入

-2

我得到了这个输出:

18446744073709551614

这是错误的,因为-2不是无符号长的长。

当我尝试更改

上的输入条件时
if((scanf("%llu", &bigNumber) == 0) || (bigNumber < 0))

令人惊讶的是,我收到了编译错误:

ex.c:6:52: error: comparison of unsigned expression < 0 is always false
      [-Werror,-Wtautological-compare]
        if((scanf("%llu", &bigNumber) == 0) || (bigNumber < 0))
                                                ~~~~~~~~~ ^ ~
1 error generated.

那么,我如何正确检查我的大号码,如果它必须是0到10 ^ 19之间的整数?

1 个答案:

答案 0 :(得分:0)

在C99标准中,输入值减号是可选的,因此如果读取减号,则不会出现错误,结果将是负数的两个补码,可能是一个非常大的值。 (Wikipedia

您必须读取已签名的号码并检查x < 0,或在比较之前将读取的无符号值转换为已签名。