【问题标题】:C++ explain casting uint64 to uint32C ++解释将uint64转换为uint32
【发布时间】: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 位足以表示该持续时间。

标签: c++ casting unsigned


【解决方案1】:

正如 cmets 中所指出的,您的代码操作没有任何问题,只是您没有正确地可视化输出。这是您的代码,已更正且可运行:

#include <cstdio>
#include <cstdint>

int main() {
  uint64_t ticks64 = 651444791362198llu;
  uint64_t ticks32_manual = ticks64 & 0xFFFFFFFF;
  uint32_t ticks32_auto = (uint32_t) ticks64;

  printf("Periods: %llX\n", ticks64);
  printf("32-bit manual truncation: %llX\n", ticks32_manual);
  printf("32-bit automatic truncation: %X\n", ticks32_auto);
}

输出是:

Periods: 2507C4F614296
32-bit manual truncation: 4F614296
32-bit automatic truncation: 4F614296

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 2017-05-31
    • 2020-06-24
    • 1970-01-01
    相关资源
    最近更新 更多