这是我的代码:

#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.

10-04 11:37