c – 这里是否发生溢出?
作者:互联网
我无法理解为什么这个程序给出了这个输出.溢出发生在这里吗?
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纳秒的文件分辨率.
解决方法:
是的,有一个溢出.您将四个int常量相乘并将它们分配给__int64.
__int64可以保存在long long中(long long应该至少有64位,因为C 11).你需要长时间标记你的常量:
__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;
作品.这会将四个整数相乘,将结果转换为int64并将其与fileAgeInFileTime2相乘.然后将总结果分配给fileAgeInFileTime2.
标签:c,integer-overflow 来源: https://codeday.me/bug/20190829/1762107.html