溢出发生在这里吗?

时间:2015-11-12 12:36:39

标签: c++ integer-overflow

我无法理解为什么这个程序会提供这个输出。溢出发生在这里吗?

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;
}

O / P:

86400

864000000000 711573504

我无法理解为什么fileAgeInFileTime和fileAgeInFileTime2有不同的值?

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

2 个答案:

答案 0 :(得分:3)

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

__int64可以保存在long long内(long long自C ++ 11以来至少应该有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

答案 1 :(得分:2)

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

解释算术运算符的

Here类型转换