Предупреждение C4244: "аргумент": преобразование из "time_t" в "unsigned int", возможная потеря данных - С++ - программирование
Подтвердить что ты не робот

Предупреждение 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", возможная потеря данных

4b9b3361

Ответ 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)) );