如果我用 C/C++ 编写以下代码:
using namespace std::chrono;
auto time = high_resolution_clock::now();
unsigned long long foo = time.time_since_epoch().count();
unsigned bar = foo;
foo 的哪些位在转换为 unsigned int 时被丢弃?有什么方法可以强制只保留最低有效位?
或者,是否有一种简单的方法可以将 foo 散列为 unsigned int 大小? (这是首选,但我在初始化列表中执行所有这些操作。)
编辑:刚刚意识到保留最低有效位仍然可以允许循环。我想哈希就是我当时要做的。
第二次编辑:为了澄清我在评论中的回应,我在循环内播种 std::default_random_engine 并且不希望溢出导致种子值重复。我正在寻找一种将 unsigned long long 散列为 unsigned int 的简单方法。
最佳答案
C 和 C++ 中无符号整数类型的算术通过模归约处理超出范围的值;例如如果 unsigned int
是 32 位类型,那么当分配一个超出范围的值时,它会减少值模 2^32
并存储最小的非负代表。
特别是,当从较大的无符号整数类型分配给较小的无符号整数类型时,这正是标准要求的。
另请注意,该标准不保证 unsigned int
的大小——例如,如果您需要一个绝对恰好 32 位宽的类型,请使用 uint32_t
.
关于c++ - 在 C++ 中从 unsigned long long 到 unsigned int 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37844507/