srand (time (null)) 导致编译器警告:隐式转换失去整数精度

新手上路,请多包涵

如果这个问题已经得到回答,我们深表歉意。

 #include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main () {

srand( time(NULL) );
cout << rand();
}

“隐式转换失去整数精度:’time_t’(又名’long’)到’unsigned int’”

当我执行上面的代码时,我得到的错误消息是什么。我正在使用 xcode 4.6.1。现在,当我使用不同的编译器(例如来自 codepad.org 的编译器)时,它执行得非常好,生成看起来像随机数的东西,所以我假设这是我需要解决的 xcode 问题?

我刚刚开始编程,所以在这方面我是一个完整的初学者。我的代码有问题还是我的编译器有问题?

任何帮助,将不胜感激!

原文由 user2576878 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

“隐式转换失去整数精度:’time_t’(又名’long’)到’unsigned int’”

您正在隐式丢失精度,因为 time() 返回一个 long 大于目标上的 unsigned int 。为了解决这个问题,您应该明确地转换结果(从而消除“隐式精度损失”):

 srand( static_cast<unsigned int>(time(nullptr)));


鉴于现在是 2017 年,我正在编辑这个问题以建议您考虑 std::chrono::*<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蓝调。

原文由 Brian Cain 发布,翻译遵循 CC BY-SA 4.0 许可协议

正如“nio”所提到的,一个干净的解决方法是显式类型转换。

更深层次的解释:

srand() 需要一个无符号整数作为参数( srand(unsigned int) ),但 time() 返回一个长整数( long int time() ),这不被 srand() 接受,所以为了解决这个问题,编译器必须简单地将“long int”类型转换(转换)为“unsigned int”。

但是在您的情况下,编译器会警告您(因为编译器的设计者认为您应该知道仅此而已)。

所以一个简单的

srand( (unsigned int) time(NULL) );

会成功的!

(如果我做错了什么,请原谅我,这是我在stackoverflow上的第一个答案)

原文由 reubenjohn 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题