我想分配内存,以便在我的C ++程序中读取(整个)非常大的文件(15-25 Gb)。我使用off64_t
类型来获取我想要读取的文件的开始和结束位置,这些位置是使用函数ftello64
从我的文件中获取的。我现在想在一个名为size的变量中得到两者之间的差异,然后将其分配给char数组。但是,尽管编译成功,但我的代码无法正常工作。
我尝试了size = (off64_t)(end_of_mem-start_of_mem);
,其中start_of_mem
和end_of_mem
都是off64_t
个数字但是当我运行我的程序时,输出是
Starting position in memory (start_of_mem):152757
Ending position in memory (end_of_mem):15808475159
Size: -1371546782
我应该使用哪种变体来实现这一目标?提前感谢您的帮助和建议。
答案 0 :(得分:2)
您正在经历从64位到32位副作用的整数下载。
看一下以下实验:
#include <cstdint>
#include <iostream>
int main(){
int64_t int64 = 15808475159 - 152757;
int32_t int32 = int64;
std::cout << "int64_t: " << int64 << "\n";
std::cout << "int32_t: " << int32 << "\n";
}
输出:
int64_t: 15808322402
int32_t: -1371546782
问题是15808475159 - 152757
的结果大于32位整数的范围。因此,由于溢出它被截断(或mod 2 ^ 32)。然后因为它被声明为带符号的32位,它显然属于负解释范围。