从无签名的长期到c 中未签名的int的转换
Conversion from unsigned long long to unsigned int in C++
如果我在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
。
好消息你安全:
- 我只是运行了
time.time_since_epoch().count()
并得到:
1,465,934,400
- 您已经有一段时间直到看到重复值,因为`numeric_limits是:
4,294,967,295
- 复制较小尺寸的积分类型:
导致多余的高阶位下降
所以,如果您只做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
(但看起来很丑)。
这是对性能的打击,但至少它减少了种子重复的机会。
- 是否可以从int转换为enum类类型
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 将字符串中的 int 转换为字母;
- 主.cpp:18:20:错误:从"int*"转换为"int"会失去精度 [-fa
- 将非常大的 int 转换为双倍,在某些计算机上会损失精度
- 如何将矢量<int>转换为字符数组?
- C++ 无法从 const int* 转换为 const_iterator
- 我不断收到错误 C2440'=':无法从"int *(__cdecl *)(int *,int *,int,int)"转换为"int *
- 如何将 int[4] 转换为 std::array<int,4>?
- 如何将data[i].int转换为vaible
- 将 int 转换为字符串,然后连接另一个变量以创建完整扩展名,然后将其转换为 const_char*
- 将私有矩阵形式 int 转换为双 C++
- 无法将参数 1 从 'int' 转换为 'int &'
- 将 int 转换为字符串后始终得到 0
- isspace 函数的性能警告,从 int 转换为布尔值
- 将大 int 转换为浮点数,而不舍入 c++
- 错误:无法将'uint8* {aka unsigned int*}'转换为"常量emxArray_uint8_T*"?
- 将未签名的INT转换为BCD
- 在 C++ 中将 int 转换为双精度