如何将-1转换为无符号类型?

前几天, 我遇到了这个结构:

static_cast(-1) 

在一些示例C ++代码中,可能(取决于size_type来自哪里的细节)等效于以下C:

 (size_t)(-1) 

据我了解,它的工作原理是二进制补码算术中-1的表示forms为11111...1 ,因为你拥有的位数很多,所以这是获得无符号最大值的快速方法像size_t这样的类型可以容纳。 但是,我的理解是,C不保证将使用二进制补码; 如果C实现使用一个补码,这将比最大值小1,如果它使用有符号幅度,它将只是最大值的一半。

是否有一些我不知道的皱纹确保无论使用的有符号整数的表示如何都能正常工作? C和C ++之间有什么不同(许多令人惊讶的事情都有)?

对无符号算术的要求保证将-1转换为无符号类型将产生目标类型可能的最大数量。 C99,§6.2.5/ 9:“……无法用结果无符号整数类型表示的结果以模数减少为模数,该数字大于可由结果类型表示的最大值。”

这在C和C ++中是相同的(在C ++标准中,类似的措辞在脚注41中找到 – 它不是规范性的,但它正在解释其他措辞)。

要做到“安全”并以“正确”(C ++)的方式行事,值得一看STL:

 std::numeric_limits::max() 

“据我了解,它的工作原理是二进制补码算法中-1的表示是……”。

不,它根本不是基于这一事实。 它基于标准要求,转换为N位无符号类型的烧结值必须产生无符号值,该值与原始带符号的一个模2 ^ N“相等”。

无论实现使用何种签名表示,它都必须以这种方式工作。 在2的补码的情况下,它本身就是这样工作的,但是对于其他表示,编译器将不得不做额外的工作以满足标准要求。

如果您希望以便携方式获取某种类型的最大值(或最小值),最好使用标准的numeric_limits类,如下所示。

 #include  size_type max = std::numeric_limits::max() size_type min = std::numeric_limits::min() 

我怀疑这些函数的某些实现可能会使用您描述的强制转换作为获取最小值/最大值的平台最佳方式。