繁体   English   中英

无符号长长溢出错误?

[英]Unsigned long long overflow error?

我一直有一些奇怪的问题与unsigned long long。

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

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

//Outputs 18446744071562067968, Expected 2147483648

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

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

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

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

要修复它,你需要将值无符号开头,如下所示:

#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; 会工作。 我只是希望尽可能明确。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM