【问题标题】:warning C4244: 'argument' : conversion from 'time_t' to 'unsigned int', possible loss of data -- C++警告 C4244:'argument':从 'time_t' 转换为 'unsigned int',可能丢失数据 - C++
【发布时间】:2012-02-12 04:55:16
【问题描述】:

我制作了一个简单的程序,允许用户选择一些骰子然后猜测结果...我之前发布了这段代码,但有错误的问题,所以它被删除了...现在我不能有任何错误甚至此代码上的警告,但由于某种原因,此警告不断弹出,我不知道如何修复它... “警告 C4244:'argument':从 '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:'argument':从 'time_t' 转换为 'unsigned int',可能会丢失数据

【问题讨论】:

  • time_t 可能是 64 位类型,而 int 是 32 位。
  • 而且,看在你信仰的任何神灵的份上,请选择 C ​​或 C++ 并坚持下去。包括cstdlibtime.h 让我想过来打你一巴掌:-)
  • 哈哈! Paxidiablo 我很想坚持使用 C++,但是这门课要求我从 C/C++ 开始,然后更多地迁移到 C++ 并尽可能地抛弃 C
  • 不,它没有。您可以包含 ctime 而不是 time.h
  • @aib 确实如此,但它本可以更明确地说明。

标签: c++


【解决方案1】:

这是因为在您的系统上,time_t 是比 unsigned int 更大的整数类型。

  • time() 返回一个 time_t,它可能是一个 64 位整数。
  • srand() 想要一个 unsigned int,它可能是一个 32 位整数。

因此您会收到警告。您可以通过演员使其静音:

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

在这种情况下,向下转换(以及潜在的数据丢失)并不重要,因为您只是用它来播种 RNG。

【讨论】:

  • +1 这只是完整的正确答案(和措辞)。
  • 呃,C 风格的转换不属于 C++ 程序。
  • @aib 它们更短。他们are fine for numerical casts.
  • 对我来说就像是一种魅力。我猜你可以使用 size_t 而不是 unsigned int,不是吗?谢谢!
  • @Fabiano 你可以。但请记住 srand()unsigned int 作为参数。如果unsigned intsize_t 在您的机器上碰巧大小不同(x64 上的情况通常如此),那么您将收到关于可能丢失数据的类似警告。所以最好还是坚持unsigned int
【解决方案2】:

这一行涉及从time_t 的隐式转换,time 返回到unsigned intsrand 采用:

srand ( time(NULL) );

您可以改为显式转换:

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

【讨论】:

    【解决方案3】:

    time() 返回一个time_t,即can be 32 or 64 bitssrand() 采用 unsigned int,它是 32 位。公平地说,您可能不会在意,因为它只是用作随机化的种子。

    【讨论】:

    • 不保证为 32/64 位。
    【解决方案4】:

    这一行涉及从 time_t 的隐式转换,时间返回到 srand 所采用的 unsigned int:

    srand ( time(NULL) );
    

    您可以改为显式转换:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-26
      相关资源
      最近更新 更多