我想在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
设置为什么值?
答案 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
。