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

时间:2009-11-03 15:17:15

标签: c++ c

前几天,I came across这个结构:

static_cast<size_type>(-1)

在一些示例C ++代码中,可能(取决于size_type的位置的详细信息)等同于以下C:

(size_t)(-1)

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

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

4 个答案:

答案 0 :(得分:20)

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

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

答案 1 :(得分:14)

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

std::numeric_limits<size_t>::max()

答案 2 :(得分:5)

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

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

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

答案 3 :(得分:2)

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

#include <limits>

size_type max = std::numeric_limits<size_type>::max()
size_type min = std::numeric_limits<size_type>::min()

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