我认为指针的最大值是使用指针大小的最高可能值,但显然不是。
#include <iostream>
#include <limits>
int main() {
std::cout << std::numeric_limits<char *>::is_bounded << std::endl;
std::cout << (void *)std::numeric_limits<char *>::min() << std::endl;
std::cout << (void *)std::numeric_limits<char *>::max() << std::endl;
}
我使用g ++编译并获得以下输出:
0
0
0
标准说如果is_bounded不为false,则min()和max()是有意义的。它还说如果类型可表示的值集合是有限的,那么is_bounded应该为真。
指针是不是有限的,或者为什么is_bounded为false而max()在我的程序中为零?
答案 0 :(得分:2)
<limits>
标头未实现std::numeric_limits<char *>
的特定重载。这意味着我们然后使用默认实现。
std::numeric_limits<T>::min()
和std::numeric_limits<T>::max()
的默认实现是返回T()
,这可以解释您获得0
的原因。
您可以看到here std::numeric_limits<T>::is_bounded()
实施的类型列表。
答案 1 :(得分:2)
指针本身就是一种类型,它是一种存储另一个变量地址的类型。 std::numeric_limits
针对处理数字的类型进行操作。指针不是数字,它们是将地址存储到存储器位置的变量。虽然地址本身可以用数字表示,但这不会产生指针数字。
min
和max
对指针毫无意义。
32位指针可以存储最大32位大小的地址。就这样。 64位指针的最大大小为64位,这意味着它可以存储最大64位的地址。这与数字最小值或最大值
无关答案 2 :(得分:2)
指针不是算术类型。
从18.3.2.1类模板numeric_limits
numeric_limits
类模板为程序提供信息 关于实现的表示的各种属性 算术类型。应为每个人提供专业化 算术类型,包括浮点数和整数,包括bool。该 成员is_specialized
对于所有这些专业都应该是真实的numeric_limits
。对于所有声明静态constexpr的成员numeric_limits
模板,专业化应定义这些值 这种方式可以用作常量表达式。 非算术标准类型,例如complex<T>
(26.4.2),不得 有专业。
因此。你的测试应用非算术类型会导致无意义的默认值。