什么是便携式方法来查找size_t的最大值?

Jus*_*cle 71 c size-t

我想知道我的程序运行的系统上size_t的最大值.我的第一直觉是使用负1,就像这样:

size_t max_size = (size_t)-1;
Run Code Online (Sandbox Code Playgroud)

但我猜测有更好的方法,或者某个地方定义的常数.

AnT*_*AnT 68

C99中存在一个清单常量(宏)并且它被调用SIZE_MAX.但是在C89/90中没有这样的常数.

但是,你在原帖中所拥有的是一种找到最大值的便携式方法size_t.它保证可以使用任何无符号类型.

  • @jamesdlin:签名到无符号的转换总是在C中定义良好.需要遵循典型的无符号模数算法的规则,其模数等于目标无符号类型的最大值加1.因此,在上面你会得到`-1 mod(<max-value> + 1)`,它总是只有`<max-value>`. (8认同)
  • @jamesdlin:§5.2.4.2.1保证`-1`可以表示为`int`.§6.3.1.3保证它转换为有效的`size_t`值. (6认同)

nat*_*ose 14

#define MAZ_SZ (~(size_t)0)
Run Code Online (Sandbox Code Playgroud)

要么 SIZE_MAX


kal*_*iya 7

作为其他答案中建议的位操作的替代方法,您可以在 C++ 中执行此操作

#include <limits>
size_t maxvalue = std::numeric_limits<size_t>::max()
Run Code Online (Sandbox Code Playgroud)

  • @jww _应该_有一个 `max()` 的 `constexpr` 版本:http://en.cppreference.com/w/cpp/types/numeric_limits/max (3认同)

Pra*_*ian 5

OP建议的解决方案size_t max_size = (size_t)-1;绝对是迄今为止最好的解决方案,但我确实找到了另一种更复杂的方法来做到这一点。我发布它只是出于学术好奇心。

#include <limits.h>

size_t max_size = ((((size_t)1 << (CHAR_BIT * sizeof(size_t) - 1)) - 1) << 1) + 1;
Run Code Online (Sandbox Code Playgroud)

  • 如果我在某些代码中发现这一点(尤其是没有注释的情况),我会变得非常脾气暴躁。:) (17认同)