C++ 解释将 uint64 转换为 uint32
C++ explain casting uint64 to uint32
我正在尝试将 uint64_t(使用升压计时高精度时钟表示从 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);
我的代码输出如下:
Periods: 651444791362198
32-bit manual truncation: 1331774102
32-bit automatic truncation: 1331774102
我原以为 32 位和原始 64 位表示的最后几位相同,但事实并非如此。也就是我以为我会把64位数字“丢掉左半边”
谁能解释一下这是怎么回事?谢谢
顺便说一句,我看过 this link。
正如评论中指出的那样,您的代码运行没有任何问题,只是您没有正确地可视化输出。这是您的代码,已更正并可运行:
#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
我正在尝试将 uint64_t(使用升压计时高精度时钟表示从 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);
我的代码输出如下:
Periods: 651444791362198
32-bit manual truncation: 1331774102
32-bit automatic truncation: 1331774102
我原以为 32 位和原始 64 位表示的最后几位相同,但事实并非如此。也就是我以为我会把64位数字“丢掉左半边”
谁能解释一下这是怎么回事?谢谢
顺便说一句,我看过 this link。
正如评论中指出的那样,您的代码运行没有任何问题,只是您没有正确地可视化输出。这是您的代码,已更正并可运行:
#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