9

我在函数中有一些代码,它将使用增量/减量运算符更改/更新值。例如:

static void update_value(char op)
{
    if (op == '+')
        value++;    // uint32_t global value
    else
        value--;
}

该函数不检查我们是否超过/低于最大值/最小值。因此,当值为 16 时,调用者可以调用它 20 次。结果为 2^32 - 1 - 4。

我想提防这种情况,但我想使用标准库常量。我记得有一个 size_t (或类似的)变量表示 uint32_t 可以容纳的最大数字。

我不记得确切的常量或定义它们的标题。有什么帮助吗?

4

7 回答 7

13

在 C 中,你想要的头文件是<stdint.h>,常量是UINT32_MAX

static void update_value(char op)
{
    if (op == '+')
        if ( value < (UINT32_MAX - 1))
            value++;    // uint32_t global value
        else
            printf("too big!\n");
    else
       if (value > 0)
           value--;
       else
           printf("too small!\n");
}

对于 C++,您可以使用此处找到的任意数量的解决方案:UINT32_MAX 的 C++ 等价物是什么?

于 2012-11-30T14:12:06.113 回答
9

我发现最通用的解决方案是检查增加的值是否实际上大于先前的值,或者减少的值是否小于先前的值。这仅在值是 unsigned 时才有效,与变量的大小无关,并且几乎与 C 代码一样可移植。

static void update_value(char op)
{
  if (op == '+') {
    if (value + 1 > value) value ++;
  } else {
    if (value - 1 < value) value --;
  }
}

请注意,代码可能碰巧使用有符号值,但根据 C 标准,这将是未定义的行为,编译器可以自由替换if (value + 1 > value) ...if (1) .... 您不应将此代码与签名值一起使用,除非您有适当的流程在链接生成的目标代码后对其进行审核。

使用 gcc 和 clang,您需要添加-fwrapv选项以让此代码适用于有符号值;使用其他编译器,您的里程可能会有所不同。

一种明智的做法是指定类型并使用来自limits.h. 例如:

#include "limits.h"

static void update_int(char op, int *value)
{
  int val = *value; // ignoring NULL pointer dereference

  if (op == '+') {
    if (val != INT_MAX) *value = val + 1;
  } else {
    if (val != INT_MIN) *value = val - 1;
  }
}

static void update_int(char op, unsigned int *value)
{
  unsigned int val = *value; // ignoring NULL pointer dereference

  if (op == '+') {
    if (val != UINT_MAX) *value = val + 1;
  } else {
    if (val != UINT_MIN) *value = val - 1;
  }
}
于 2012-11-30T16:51:05.263 回答
4

也许您正在寻找<limits>http ://www.cplusplus.com/reference/limits/numeric_limits/

你可以做这样的事情来得到你想要的:

unsigned int n = numeric_limits<unsigned int>::max()

你也有这个<cstdint>http ://www.cplusplus.com/reference/cstdint/

UINTN_MAX:精确宽度无符号类型的最大值(正好 2^N-1)

于 2012-11-30T14:10:16.557 回答
2

如果您使用的是 C,那么您正在寻找limits.h。你想要的宏是UINT_MAX.

如果你在 C++ 世界,你想要std::numeric_limits<uint32_t>::max().

于 2012-11-30T14:10:05.373 回答
2

检查#include <stdint.h>http://en.wikipedia.org/wiki/C_data_types#Fixed_width_integer_types

您正在寻找的是UINT32_MAX.

于 2012-11-30T14:12:30.887 回答
0
static void update_value(char op)
{
    if (op == '+')
        if (value == UINT_MAX)
            printf("Maximum value achieved.\n");
        else
            value ++;
    else
       if (value == 0)
           printf("Minimum value achieved.\n");
       else
           value --;
}

UINT_MAX,对于这个常数,你必须包括limits.h

于 2012-11-30T16:33:42.390 回答
-1

您需要limits.h(INT_MIN和INT_MAX):更多信息:http ://www.cplusplus.com/reference/climits/

于 2012-11-30T14:12:57.110 回答