数据类型uint64_t未知行为
Unknown behavior of uint64_t datatype
我试图在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
中时为零。
相关文章:
- 继承期间显示未知行为的子类
- 输入中的字符串数未知(以字母表示)
- 具有未知值时的时间复杂性
- 链表中写入访问冲突的未知原因
- 正在生成未知类实例
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 读取文件时运行时的未知行为
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- 初始化多个未知基类
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 如何存储未知次数迭代的输入?
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 编译 Boost 时在 OS X 上的"ld:未知选项:-soname"
- 未知的 CMake 命令"create_single_source_cgal_program"
- 如何在C++中循环访问未知对象方法?
- Coursera :自动评分器的未知信号 11
- 即使直接从官方示例中复制,也找不到未知类型名称QML_ELEMENT和 QML 模块
- 未知的 GCC 链接器错误,但已成功构建
- 如何从未知视图中声明范围::v3::View 变量
- std::string.size() 未知行为