c++ - 在 C++ 中从 unsigned long long 到 unsigned int 的转换

标签 c++ c++11 hash

如果我用 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/

相关文章:

c++ - 在 CMake 中引入最小的 C++ 标准版本

c++ - 仅在 boost::hash_combine 中运行一个程序期间保证确定性

c++ - 为什么这段代码返回 0 和 1?

C++11x 和 Eigen 库

c++ - 如何在可变参数模板函数中访问参数

c++ - 部分模板参数应用程序的部分模板特化不适用于 GCC 4.8.1

java - 实现固定大小的 HashMap

ruby - 将作为键值对的字符串转换为 ruby​​ 中的哈希

c++ - Scripting::LState 的多重定义

c++ - 如果函数指针不需要 & 符号,为什么 boost::bind 需要一个?