有人能发现造成这种情况的原因吗?我甚至没有在这段代码中定义任何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行。
答案 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)
答案 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不同。因此警告。