Srand(time(NULL))导致编译器警告:隐式转换丢失整数精度
如果此问题已得到回答,请原谅。
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main () {
srand( time(NULL) );
cout << rand();
}
"隐式转换丢失整数精度:‘time_t’(又名‘long’)到‘unsign int’"
是我在执行上面的代码时收到的错误消息。我使用的是Xcode4.6.1。现在,当我使用不同的编译器时,例如来自coadead.org的编译器,它执行得非常好,生成看起来像随机数的东西,所以我假设这是一个Xcode问题,我需要解决?
我刚刚开始编程,所以在这方面我完全是个初学者。是我的代码有问题还是编译器有问题?
如有任何帮助,我们将不胜感激!
解决方案
由于"隐式转换丢失整数精度:‘time_t’(又名‘long’)到‘unsign int’"
time()
返回的long
大于目标上的unsigned int
,因此您正在隐式失去精度。为了解决此问题,您应该显式转换结果(从而消除"隐式精度损失"):
srand( static_cast<unsigned int>(time(nullptr)));
考虑到现在是2017年,我编辑这个问题是为了建议您将
<chrono>
中定义的std::chrono::*
提供的功能视为C++11的一部分。您最喜欢的编译器是否提供C++11?如果不是,它真的应该!
若要获取当前时间,应使用:
#include <chrono>
void f() {
const std::chrono::time_point current_time = std::chrono::system_clock::now();
}
当time()
起作用时,我为什么要担心这个?
IMO,只有一个原因就足够了:明确、显式的类型。当您在足够大的团队中处理大型程序时,了解传递的值代表的是时间间隔还是"绝对"时间,以及大小是至关重要的。使用std::chrono
,您可以设计可移植的接口和数据结构,并跳过is-that-timeout-a-deadline-or-milliseconds-from-now-or-wait-was-it-seconds Blues。
相关文章