我想知道我的程序正在运行的系统上size_t的最大值。我的第一个本能是使用负1,如下所示:
size_t max_size = (size_t)-1;
但是我猜想有更好的方法,或者在某个地方定义一个常量。
我想知道我的程序正在运行的系统上size_t的最大值。我的第一个本能是使用负1,如下所示:
size_t max_size = (size_t)-1;
但是我猜想有更好的方法,或者在某个地方定义一个常量。
size_t
类型变量的无效值。例如,std::string::npos
设置为(size_t)-1
(至少在MSVC实现中)。
size_t max_size = (size_t)-1;
实际上是什么以及如何做?谢谢。
size_t
根据标准是无符号类型。可以这么说,它定义为32位值。对于使用二进制补码的有符号值,-1表示为0xffffffff。但是,如果将其强制转换为size_t(这是一个无符号类型),那么它将是最大值。(size_t)(-1)
与(size_t)(0xffffffff)
32位系统上的相同。最好使用-1,因为它在16位(0xffff)或64位时也可以使用。
Answers:
清单常量(宏)存在于C99中,称为 SIZE_MAX
。但是C89 / 90中没有这样的常数。
但是,您在原始帖子中拥有的是一种完美的可移植方法,可找到的最大值size_t
。保证可以与任何无符号类型一起使用。
-1 mod (<max-value> + 1)
,这总是正义的<max-value>
。
-1
将其表示为int
。第6.3.1.3节保证其转换为有效值size_t
。
size_t
是无符号类型,因此所有值都是有效的。这不能表示陷阱,因为没有此类陷阱。
6.2.6.2 Integer types
”:If there are N value bits, each bit shall represent a different power of 2 between 1 and 2^N−1..
因此对于无符号整数类型,确实没有任何可能。
作为其他答案中建议的位操作的替代方法,您可以在C ++中执行此操作
#include <limits>
size_t maxvalue = std::numeric_limits<size_t>::max()
std::numeric_limits<size_t>::max()
不是constexpr
,并且某些编译器(例如Clang)未对其进行优化。GCC,ICC和MSC处理得很好。通常最好坚持下去#define
。
size_t max_size = (size_t)-1;
OP提出的解决方案绝对是迄今为止最好的解决方案,但我确实想出了另一种更复杂的方法。我发布它只是出于学术上的好奇心。
#include <limits.h>
size_t max_size = ((((size_t)1 << (CHAR_BIT * sizeof(size_t) - 1)) - 1) << 1) + 1;
如果您假设至少使用C ++ 11编译器,则应该可以使用SIZE_MAX: