Предупреждение C4244: "аргумент": преобразование из "time_t" в "unsigned int", возможная потеря данных - С++
Я сделал простую программу, которая позволяет пользователю выбрать несколько костей, а затем угадать результат... Я отправил этот код раньше, но с неправильным вопросом, поэтому он был удален... теперь у меня не может быть ошибок или даже предупреждения по этому коду, но по какой-то причине это предупреждение продолжает выскакивать, и я не знаю, как это исправить...
"C4244:" аргумент ": преобразование из" time_t "в" unsigned int ", возможная потеря данных"
#include <iostream>
#include <string>
#include <cstdlib>
#include <time.h>
using namespace std;
int choice, dice, random;
int main(){
string decision;
srand ( time(NULL) );
while(decision != "no" || decision != "No")
{
std::cout << "how many dice would you like to use? ";
std::cin >> dice;
std::cout << "guess what number was thrown: ";
std::cin >> choice;
for(int i=0; i<dice;i++){
random = rand() % 6 + 1;
}
if( choice == random){
std::cout << "Congratulations, you got it right! \n";
std::cout << "Want to try again?(Yes/No) ";
std::cin >> decision;
} else{
std::cout << "Sorry, the number was " << random << "... better luck next time \n" ;
std::cout << "Want to try again?(Yes/No) ";
std::cin >> decision;
}
}
std::cout << "Press ENTER to continue...";
std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
return 0;
}
Вот что я пытаюсь выяснить, почему я получаю это предупреждение:
предупреждение C4244: "аргумент": преобразование из "time_t" в "unsigned int", возможная потеря данных
Ответы
Ответ 1
Это потому, что в вашей системе time_t
больше целочисленного типа, чем unsigned int
.
-
time()
возвращает time_t
, который, вероятно, является 64-разрядным целым.
-
srand()
хочет unsigned int
, который, вероятно, является 32-разрядным целым.
Следовательно, вы получите предупреждение. Вы можете отключить его приложением:
srand ( (unsigned int)time(NULL) );
В этом случае понижающая (и потенциальная потеря данных) не имеет значения, поскольку вы используете ее только для семян RNG.
Ответ 2
Эта строка включает неявный листинг из time_t
, который time
возвращается к unsigned int
, который srand
принимает:
srand ( time(NULL) );
Вместо этого вы можете сделать явное преобразование:
srand ( static_cast<unsigned int>(time(NULL)) );
Ответ 3
time()
возвращает a time_t
, который может быть 32 или 64 бита. srand()
принимает значение unsigned int
, которое равно 32 бит. Чтобы быть справедливым, вам, вероятно, все равно, поскольку он используется только как семя для рандомизации.
Ответ 4
В этой строке подразумевается неявное отбрасывание из time_t, время которого возвращается к unsigned int, который принимает srand:
srand ( time(NULL) );
Вместо этого вы можете сделать явное преобразование:
srand ( static_cast<unsigned int>(time(NULL)) );