uint64_t数据类型的未知行为

时间:2015-04-18 21:10:41

标签: c++

我想在uint64_t中存储一个非常大的数字,如:

int main(int argc, char** argv) {    
    uint64_t ml = sizeof(void*)*(1<<63);
    cout << "ml=" << ml << "\n";
    const char* r;
    const char* mR=r+ml;
    return 0;
}

但我不知道为什么我将输出设为0,尽管将其存储在uint64_t数据类型中?

编辑:char* mR是我的内存缓冲区,我可以将内存缓冲区增加到最多ml。我想使用64GB RAM机器。那么,你能否建议我应该增加多少mR ...我想要使用所有可用的RAM。那是我应该将ml设置为什么值?

4 个答案:

答案 0 :(得分:4)

尝试

uint64_t ml = ((uint64_t)1)<<63;

或只是

uint64_t ml = 0x8000000000000000;

Just 1 << 63使用整数,如果shift值太大,则是未定义的行为。在您的情况下,由于溢出,可能会导致0

请注意,如果您将0x8000000000000000乘以sizeof(void*),您可能也会溢出。

答案 1 :(得分:1)

只需使用:

uint64_t ml = sizeof(void*) * (1ULL << 63);

因为正如AlexD所说,1&lt;&lt; 63使用整数,并且1&lt;&lt; 63实际上是0。

答案 2 :(得分:1)

如果你想分配64G内存,那就是:

char* buffer = new char[64ULL * 1024 * 1024 * 1024];

或简单地说:

char* buffer = new char[1ULL << 36];

请注意,64G是2 ^ 36个字节,远远小于您尝试使用的2 ^ 63个数字。虽然,通常当你使用那么多内存时,它是因为你的程序通过各种操作有机地使用它...而不是仅仅将它分配到一个大块中。

答案 3 :(得分:0)

即使您将班次更正为(uint64_t)1 << 63,如果sizeof(void*)为任意偶数(并且确定为偶数),那么您的商品将被2^64整除,因此为零存储在uint64_t