这是我的代码:
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
hFind = FindFirstFile("C:\\Windows10.official.16.November.2016.iso",&FindFileData);
if ( hFind == INVALID_HANDLE_VALUE )
cout << "Can't Find the File\n";
cout << ( ( FindFileData.nFileSizeHigh * ( MAXDWORD + 1 ) ) + FindFileData.nFileSizeLow );
return 0;
}
输出为:
2300968960
但实际文件大小为6.14 GB
所以输出应该是这样的
6592774799
谁能帮我为什么?
最佳答案
您需要做的是将( ( FindFileData.nFileSizeHigh * ( MAXDWORD + 1 ) ) + FindFileData.nFileSizeLow )
表达式的至少一部分扩展到64位,以防止32位溢出。
我在这里使用位运算是因为我认为这样的事情更自然,但适用相同的原理:
uint32_t hi = 0x12345678, lo = 0x90ABCDEF;
uint64_t hilo = ( static_cast<uint64_t>( hi ) << 32 ) | lo;
因此,将
hi
转换为64位将确保整个计算是在64位上完成的。Live Demo.