无符号长长溢出错误?

时间:2014-06-01 02:18:03

标签: c++ visual-c++ integer-overflow unsigned-long-long-int

我在使用unsigned long long时遇到了一些奇怪的问题。

当我设置无符号长long时会发生这种情况(我使用了size_t,但问题是可以用u-l-l重复)。我把它设置为2 ^ 31,但由于某种原因它恢复到18446744071562067968,或2 ^ 64 - 2 ^ 31。请记住我正在使用x64编译:

unsigned long long a = 1 << 31;
cout << a;

//Outputs 18446744071562067968, Expected 2147483648

我认为u-l-l的极限是2 ^ 64-1?那么为什么2 ^ 31不能存储呢? 2 ^ 30工作得很好。 sizeof(a)返回8,如果我没有记错,则为64位,证明限制为2 ^ 64-1。

我正在编译Visual C ++ 2013 Express Desktop。

我唯一的猜测是它是某种类型的溢出错误,因为它不适合普通的long类型。

1 个答案:

答案 0 :(得分:2)

当负整数值分配给无符号长整数时,您看到的是符号扩展。

要解决此问题,您需要将值无符号设置为开头,如下所示:

#include <iostream>
#include <iomanip>

int main()
{
    unsigned long long a = 1ull << 31ull;
    std::cout << a << "\n";
    std::cout << std::hex << a << "\n";

    return 0;
}

如果您将警告级别设置得足够高(/ W4),您会看到有关签名/未签名不匹配的警告。

为了完成,您不需要对两个参数进行限定,只需左操作数就可以了,因此unsigned long long a = 1u << 31;可以正常工作。我只是希望尽可能明确。