什么是找到size_t最大值的可移植方法?


74

我想知道我的程序正在运行的系统上size_t的最大值。我的第一个本能是使用负1,如下所示:

但是我猜想有更好的方法,或者在某个地方定义一个常量。


2
那是您达到的非常聪明的把戏。+1!
Mhmmd

是的,您所拥有的一切都很好(顺便说一下,您不需要演员表)。
斯蒂芬·佳能

2
@Craig:一个可能的原因可能是将其设置为size_t类型变量的无效值。例如,std::string::npos设置为(size_t)-1(至少在MSVC实现中)。
Praetorian

1
有人可以解释,size_t max_size = (size_t)-1;实际上是什么以及如何做?谢谢。
Kolyunya

4
size_t根据标准是无符号类型。可以这么说,它定义为32位值。对于使用二进制补码的有符号值,-1表示为0xffffffff。但是,如果将其强制转换为size_t(这是一个无符号类型),那么它将是最大值。(size_t)(-1)(size_t)(0xffffffff)32位系统上的相同。最好使用-1,因为它在16位(0xffff)或64位时也可以使用。
2014年

Answers:


70

清单常量(宏)存在于C99中,称为 SIZE_MAX。但是C89 / 90中没有这样的常数。

但是,您在原始帖子中拥有的是一种完美的可移植方法,可找到的最大值size_t。保证可以与任何无符号类型一起使用。


谢谢,我的编译器需要强制转换,或者在整数转换期间发出有关符号变化的警告。
Justicle

8
@jamesdlin:有符号到无符号的转换始终在C中定义良好。需要遵循典型的无符号取模运算的规则,其模取等于目标无符号类型的最大值加1的模。因此,在上面你会得到的-1 mod (<max-value> + 1),这总是正义的<max-value>
AnT

6
@jamesdlin:第5.2.4.2.1节保证可以-1将其表示为int。第6.3.1.3节保证其转换为有效值size_t
斯蒂芬·佳能

1
@jamesdlin:另一种查看方式size_t是无符号类型,因此所有值都是有效的。这不能表示陷阱,因为没有此类陷阱。
詹斯·古斯特

1
@jamesdlin:是的,无符号类型真的很简单;-)来自“ 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..因此对于无符号整数类型,确实没有任何可能。
詹斯·古斯特

14

要么 SIZE_MAX


5

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


1
std::numeric_limits<size_t>::max()不是constexpr,并且某些编译器(例如Clang)未对其进行优化。GCC,ICC和MSC处理得很好。通常最好坚持下去#define
jww

3
@jww应该有可用的constexpr版本max()en.cppreference.com/w/cpp/types/numeric_limits/max
underscore_d

4

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


13
如果我应该在某些代码中找到它(尤其是没有评论),那将使我非常脾气暴躁。:)
Craig McQueen 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.