为什么我会出现“常数太大”的错误?

时间:2009-11-07 06:24:33

标签: c++ visual-c++

我是Windows开发的新手,我很困惑。

当我使用Visual C ++ 2010编译此代码时,出现“常量太大”的错误。为什么我会收到此错误,如何解决?

谢谢!

int _tmain(int argc, _TCHAR* argv[])
{
    unsigned long long foo = 142385141589604466688ULL;
    return 0;
}

5 个答案:

答案 0 :(得分:9)

你所表达的数字序列大概需要67位 - 也许你的“无符号长long”类型只需要(!)64位,你的数字序列不适合它等等。

如果您经常需要处理不适合64位的整数,您可能需要查看平滑支持它们的语言,例如Python(可能带有gmpy ;-)。或者,放弃语言支持并选择合适的库,例如GMPMPIR! - )

答案 1 :(得分:4)

long long是64位,因此保持最大值2 ^ 64,其为有符号值9223372036854775807,无符号值为18446744073709551615。你的价值更大,因此它是一个太大的常数值。

选择不同的数据类型来保存您的价值。

答案 2 :(得分:2)

你得到错误是因为你的常数太大了。

来自Wikipediaunsigned long long的最大值至少为18,446,744,073,709,551,615

以下是最大值和您的值:

 18,446,744,073,709,551,615  // Max value
142,385,141,589,604,466,688  // Your value

了解为什么你的价值太长了?

答案 3 :(得分:0)

根据http://msdn.microsoft.com/en-us/library/s3f49ktz%28VS.100%29.aspx,无符号长long的范围是0到18,446,744,073,709,551,615。

142385141589604466688> 18446744073709551615

答案 4 :(得分:0)

您已达到硬件限制以直接表示整数。

似乎超过64位(在您的硬件上)需要通过软件构造模拟整数。有几个项目有帮助。

见BigInt
http://sourceforge.net/projects/cpp-bigint/

注意:其他人误解了long long有64位的限制 这不准确。该语言的唯一限制是:
(另请注意:目前C ++不支持long long(但C确实如此)它是您的编译器的扩展(进入下一版本的标准))

sizeof(long) <= sizeof(long long)
sizeof(long long) * CHAR_BITS >= 64   // Not defined explicitly but deducible from
                                      // The values defined in limits.h

详情请见:
What is the difference between an int and a long in C++?