【发布时间】:2015-06-06 21:47:26
【问题描述】:
我正在尝试将 uint64_t(使用 boost chrono 高精度时钟表示从 D 日开始的纳秒时间)转换为 uint32_t,以便为随机数生成器提供种子。
我只想要 uint64_t 的最低有效 32 位。这是我的尝试:
uint64_t ticks64 = dtn.count(); // This has the ticks in nanosec
uint64_t ticks32_manual = ticks64 & 0xFFFFFFFF;
uint32_t ticks32_auto = (uint32_t) ticks64;
mexPrintf("Periods: %llu\n", ticks64);
mexPrintf("32-bit manual truncation: %llu\n", ticks32_manual);
mexPrintf("32-bit automatic truncation: %u\n", ticks32_auto);
我的代码输出如下:
期间:651444791362198
32位手动截断:1331774102
32位自动截断:1331774102
我原以为 32 位和原始 64 位表示的最后几位数字相同,但事实并非如此。也就是说,我以为我会“丢失”64位数字的左半部分。
谁能解释这里发生了什么?谢谢。
顺便说一句,我见过this link。
【问题讨论】:
-
I was expecting the last few digits of the 32 and original 64-bit representations to be the same, but they are not-- 这是因为您正在查看以 10 为底的表示形式的两个数字,而不是以 2 为底或任何其他可被 2 整除的表示形式。您不应该期望最后几位数字将是相同的以 10 为基数的数字。不过,使用十六进制会起作用。 -
将
dtn.count()替换为651444791362198。将%llu更改为%016llx并将%u更改为%08x。重新运行程序。你开悟了吗? -
糟糕。是的。所以我想(uint32_t)(651444791362198 % 1E6),那么
-
或者,对于完整的 32 位范围,(uint32_t) (time64 % UINT32_MAX)。不过,这会再次更改最后几位数字。
-
@Salmonstrikes:这就是所谓的 UNIX 时代,是的,现在是午夜。而 64 位足以表示该持续时间。