【问题标题】:What is a portable method to find the maximum value of size_t?找到size_t最大值的可移植方法是什么?
【发布时间】:2016-12-03 08:27:25
【问题描述】:

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

size_t max_size = (size_t)-1;

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

【问题讨论】:

  • 这是一个非常聪明的技巧。 +1!
  • 是的,你所拥有的一切都很好(顺便说一句,你不需要演员表)。
  • @Craig:一个可能的原因是将其设置为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) 与 32 位系统上的 (size_t)(0xffffffff) 相同。最好使用 -1,因为如果它是 16 位 (0xffff) 或 64 位也可以。

标签: c size-t


【解决方案1】:

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

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

【讨论】:

  • 谢谢,我的编译器需要强制转换,或者在整数转换期间发出关于符号更改的警告。
  • @jamesdlin:有符号到无符号的转换总是在 C 中定义良好。它需要遵循典型的无符号模运算规则,模等于目标无符号类型的最大值加 1。因此,在上述情况下,您将得到 -1 mod (<max-value> + 1),它始终只是 <max-value>
  • @jamesdlin:§5.2.4.2.1 保证-1 可以表示为int。 §6.3.1.3 保证它转换为有效的size_t 值。
  • @jamesdlin:另一种理解方式是size_t 是无符号类型,因此所有值都是有效的。这不可能是陷阱表示,因为没有这样的陷阱。
  • @jamesdlin: 是的,无符号类型真的很简单 ;-) from "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.. 所以对于无符号整数类型,真的没有什么意外的可能。
【解决方案2】:
#define MAZ_SZ (~(size_t)0)

SIZE_MAX

【讨论】:

    【解决方案3】:

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

    #include <limits>
    size_t maxvalue = std::numeric_limits<size_t>::max()
    

    【讨论】:

    • std::numeric_limits&lt;size_t&gt;::max() 不是 constexpr,并且它没有被一些编译器很好地优化,比如 Clang。 GCC、ICC 和 MSC 处理得很好。最好坚持使用#define
    • @jww 应该有一个constexpr 版本的max() 可用:en.cppreference.com/w/cpp/types/numeric_limits/max
    【解决方案4】:

    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;
    

    【讨论】:

    • 如果我在某些代码中发现了这一点(尤其是没有注释的情况下),那会让我非常暴躁。 :)
    【解决方案5】:

    如果您假设至少有 C++11 编译器,那么您应该可以使用 SIZE_MAX:

    http://en.cppreference.com/w/c/types/limits

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-06
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多