从无签名的长期到c 中未签名的int的转换

Conversion from unsigned long long to unsigned int in C++

本文关键字:int 转换      更新时间:2023-10-16

如果我在c/c 中编写以下代码:

using namespace std::chrono;
auto time = high_resolution_clock::now();
unsigned long long foo = time.time_since_epoch().count();
unsigned bar = foo;

转换为未签名的int中,哪些foo掉落了?有什么办法只能执行要保存最低的显着位?

另外,是否有一种简单的方法可以将foo放入未签名的int尺寸中?(这是首选的,但是我正在初始化列表中进行所有这些。)

编辑:刚刚意识到保留最小的钻头仍然可以循环。我是我要做的。

第二次编辑:为了澄清我在评论中回答的内容,我正在播种std :: default_random_engine在循环中,并且不希望溢出来导致种子值重复。我正在寻找一种简单的方法,可以长时间使用unsigned int。

算术在C中,在C 中具有无符号积分类型,通过模块化降低来处理超出范围值的范围;例如如果unsigned int是32位类型,则在分配一个值之外的值之外,它会降低值Modulo 2^32并存储最小的非负代表。

特别是,这正是标准从较大到较小的无符号积分类型分配时的要求。

还请注意,该标准不能保证unsigned int&MDASH的大小;如果需要,例如,肯定是宽32位的类型,请使用uint32_t

好消息你安全:

  1. 我只是运行了 time.time_since_epoch().count()并得到:

1,465,934,400

  1. 您已经有一段时间直到看到重复值,因为`numeric_limits是:

4,294,967,295

  1. 复制较小尺寸的积分类型:

导致多余的高阶位下降

所以,如果您只做static_cast<unsigned int>(foo),大约136年就不会获得匹配的输出:numeric_limits<unsigned int>::max / 60U / 60U / 24U / 356U

ps您不会在当时重复重复。

回答《编辑二》中的问题,您可以根据启动何时和需要种子的时间之间的三角洲种子。例如:

std::default_random_engine generator;
typedef std::chrono::high_resolution_clock myclock;
myclock::time_point beginning = myclock::now();
for (int i = 0; i < 128; i++) // or whatever type of loop you're using
{
    // obtain a seed from the timer
    myclock::duration d = myclock::now() - beginning;
    unsigned seed = d.count();
    generator.seed(seed);
    // TODO: magic
}

好吧,我已经解决了使用std::hash

std::hash<long long> seeder;
auto seed = seeder(time.time_since_epoch().count());

由于我在初始化列表中进行此操作,因此可以将其放在一行中并传递给std::default_random_engine(但看起来很丑)。

这是对性能的打击,但至少它减少了种子重复的机会。