Srand(time(NULL))导致编译器警告:隐式转换丢失整数精度

2022-08-29 00:00:00 c++ compiler-warnings

如果此问题已得到回答,请原谅。

#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。

相关文章