C++ uint64_t数据类型的未知行为

C++ uint64_t数据类型的未知行为,c++,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; } intmain(intargc,char**arg

我试图在
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;
}
intmain(intargc,char**argv){
uint64\u t ml=sizeof(void*)*(1Try

只要
1试试

只需
1只需使用:

uint64_t ml = sizeof(void*) * (1ULL << 63);
uint64\u t ml=sizeof(void*)*(所有只需使用:

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

uint64\u t ml=sizeof(void*)*(1ll即使您将移位更正为
(uint64\u t)1即使您将移位更正为
(uint64\u t)1如果您想要分配64G内存,那将是:

char* buffer = new char[64ULL * 1024 * 1024 * 1024];
或者简单地说:

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

char*buffer=new char[1all如果您想分配64G内存,那将是:

char* buffer = new char[64ULL * 1024 * 1024 * 1024];
或者简单地说:

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


char*buffer=new char[1稍后我会使用ml来增加字符指针,在这种情况下是否有效?好的。我可以更改我的数据类型。是否有一些数据类型可以容纳更大的值,例如(2^96)而不是(2^63)@StegVerner我们刚刚将
ml
设置为“大值”。我不太明白您以后想如何使用它来递增字符指针。@StegVerner,一个大整数库。@chris好的,请您解释一下。我是C++新手,实际上后来我用ml递增字符指针。在这种情况下可以吗?好的。我可以更改我的数据类型。有什么数据类型可以容纳la吗rger值,比如(2^96)而不是(2^63)@StegVerner,我们只是将
ml
设置为“大值”。我不太明白您以后想如何使用它来递增字符指针。@StegVerner,一个大整数库。@chris Ok,请您解释一下。我是C++新手,让编译器帮助您:警告:移位计数>=宽度type@chris好的。你建议我使用哪种数据类型。实际上,稍后我想增加character pointer如果你想增加一个字符指针,比如
r
,你只需要写
++r
。你用
ml
做什么对这个目的没有意义。也许你还没有描述好你想做什么:试着更精确更详细。你想做什么?如果你需要保留一大堆备忘录我喜欢那样(或根本不喜欢),使用向量并对其调用
reserve
。让编译器帮助您:警告:移位计数>=宽度type@chris好的。你建议我使用哪种数据类型。实际上,稍后我想增加字符指针。如果你想增加字符指针,例如
r
,你只需编写
++r
。你在做什么使用
ml
对这个目的没有任何意义。也许你没有描述你想要做好的事情:试着更精确、更详细。你想做什么?如果你需要保留大量这样的内存(或任何内存),使用向量并对其调用
reserve
1是的,它实际上是。根据标准第5.8节移位运算符:“如果右操作数为负,或大于或等于提升后的左操作数的位长度,则行为未定义。”
1是的,实际上是。根据标准第5.8节移位运算符:“如果右操作数为负,或大于或等于提升后的左操作数的位长度,则行为未定义。”