这里是否发生溢出
Is overflow happening here?
我不明白为什么这个程序会给出这个输出。这里发生溢出了吗?
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
。
这里解释了算术运算符的类型转换
相关文章:
- 从双精度转换为整数的显式类型是否始终检查整数溢出?
- 将字符串转换为整数类型T,检查是否存在溢出
- 是否有可能通过溢出 C 中的第一个元素来写入数组第二个元素
- C++ 测试以查看双 * 双精度是否会溢出uint64_t
- 虚拟功能是否不太可能导致堆栈溢出
- C 文本写入随机数据.是否有缓冲区溢出
- 是否有一些有意义的统计数据来证明保持有符号整数算术溢出未定义是合理的
- 整数溢出是否会影响其他变量
- 无符号位字段的溢出是否保证环绕
- 编译器是否有可能检测整数溢出或其他数据类型溢出的可能性
- "auto"对 C++17 中的整数溢出是否安全?
- 当与可能导致缓冲区溢出的功能一起使用时,外部变量是否比其他变量更大
- 检查计算是否会导致溢出 c++
- 缓冲区溢出是否发生在C++字符串中
- 正在检查多个数字是否溢出
- 如果数组是否溢出,则打印
- 在IEEE浮点实现中,当溢出导致INF时,它是否被认为是未定义的bahavior
- 这里是否发生溢出
- 为了查看结构体中的另一个元素而溢出一个元素是否合法?
- 在溢出的情况下,i++是否对小于int的有符号类型调用未定义的行为?