数据类型uint64_t未知行为

Unknown behavior of uint64_t datatype

本文关键字:未知 uint64 数据类型      更新时间:2023-10-16

我试图在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设置什么值?

尝试

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

或者只是

uint64_t ml = 0x8000000000000000;

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

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

如果要分配 64G 的内存,那就是:

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

或者简单地:

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

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

只需使用:

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

因为,正如 AlexD 已经说过的,1 <<63 使用整数,而 1 <<63 实际上是 0。

即使在你更正为(uint64_t)1 << 63之后,如果sizeof(void*)是任何偶数(它肯定是),那么你的乘积将被2^64整除,因此当存储在uint64_t中时为零。