从时间(NULL)播种随机数生成器时,为什么会收到有关可能的数据丢失的警告?

时间:2011-10-03 13:23:21

标签: c++ compiler-errors compiler-warnings

我正在学习矢量并制作了一些代码,可以选择我可以在荷兰购买彩票的随机数字。但是虽然它运行,编译器警告我'从'​​time_t'转换为'unsigned int,可能会丢失数据'。

有人能发现造成这种情况的原因吗?我甚至没有在这段代码中定义任何unsigned int;我理解默认情况下,int是一个signed int。感谢您的见解。

#include <iostream>
#include <vector>
#include <string>
#include <ctime>
using namespace std;

void print_numbers();
string print_color();

int main() {
srand(time(NULL));
print_numbers();
string color = print_color();
cout << color << endl;

system("PAUSE");
return 0;
}

//Fill vector with 6 random integers. 
//
void print_numbers() {
vector<int> lucky_num;

for (int i = 0; i < 6; i++) {
    lucky_num.push_back(1 + rand() % 45);
    cout << lucky_num.at(i) << endl;
}
}

//Select random color from array.
//
string print_color() {
string colors[6] = {"red", "orange", "yellow", "blue", "green", "purple"};
int i = rand()%6;
return colors[i];
}

确切的编译器消息:警告C4244:'参数':从'time_t'转换为'unsigned int',可能丢失数据。第11行。

6 个答案:

答案 0 :(得分:7)

由于time_t的大小恰好比特定平台上的unsigned int大,因此会收到警告。从“较大”类型转换为“较小”类型涉及截断和丢失数据,但在您的特定情况下它并不重要,因为您只是播种随机数生成器并且溢出unsigned int应该发生在遥远的未来约会。

明确地将其投射到unsigned int应禁止警告:

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

答案 1 :(得分:1)

srand(time(NULL));&lt; - 这一行。 time返回time_t类型的整数,并将其转换为unsigned int。 time_t的类型为unsigned [尽可能最大的int值]。

答案 2 :(得分:0)

time_t在许多平台上都是64位值,以防止在unsigned int为32位时最终包装的纪元时间。

在你的情况下,你不在乎因为你只是播种随机数发生器。但在其他代码中,如果您的软件处理日期past 2038,那么当您转换为32位值时,可能会将time_t截断为32位2038之前的日期。

答案 3 :(得分:0)

time会返回time_t个对象。

srand期待一个unsigned int。

答案 4 :(得分:0)

srand(time(NULL));

如果time的返回值超出unsigned int的表示范围,则此行可能会溢出,这当然是可能的。

答案 5 :(得分:0)

void srand ( unsigned int seed );
time_t time ( time_t * timer );
typedef long int __time_t;

long int与unsigned int不同。因此警告。

(来自stackoverflow