这里是否发生溢出

Is overflow happening here?

本文关键字:溢出 是否 这里      更新时间:2023-10-16

我不明白为什么这个程序会给出这个输出。这里发生溢出了吗?

int _tmain(int argc, _TCHAR* argv[])
{
     __int64 fileAgeInFileTime ;
     fileAgeInFileTime = 24  *60 * 60 ;
     cout << fileAgeInFileTime << endl;
     fileAgeInFileTime *= 10000000;
     __int64 fileAgeInFileTime2 = 24  *60 * 60  * 10000000 ;
     cout << fileAgeInFileTime << "  " <<fileAgeInFileTime2;
    return 0;
}

操作 :

86400

864000000000 711573504

我不明白为什么 fileAgeInFileTime 和 fileAgeInFileTime2 有不同的值?

真正的要求是获得文件的100纳秒分辨率。

是的,有溢出。您将四个常量相乘int并将它们分配给__int64

__int64可以保存在long long内(自C++11以来long long应至少有64位(。您需要将常量标记为long long如下所示:

__int64 fileAgeInFileTime2 = 24LL * 60LL * 60LL * 10000000LL;

或者将这些常量中的第一个标记为LL,其他常量被隐式转换:

__int64 fileAgeInFileTime2 = 24LL * 60 * 60 * 10000000;

某种强制转换也可以工作(其他变量也被隐式转换(:

__int64 fileAgeInFileTime2 = static_cast<__int64>(24) * 60 * 60 * 10000000;

最后一行也应该解释为什么

__int64 fileAgeInFileTime2 = 10000000;
fileAgeInFileTime2 *= 24 * 60 * 60;

工程。这将乘以四个int,将结果转换为int64并将其乘以 fileAgeInFileTime2 。然后将总结果分配给fileAgeInFileTime2

是的,你在这里溢出了。当你int乘以 int 时,结果也是 int,所以你在计算 24 * 60 * 60 * 1000000 时有溢出。在此之后,不正确的结果将存储在变量__int64

这里解释了算术运算符的类型转换