9

インクリメント/デクリメント演算子で値を変更/更新する関数にコードがあります。例えば:

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

この関数は、最大値/最小値を上回ったか下回ったかどうかをチェックしません。したがって、値が 16 の場合、呼び出し元は 20 回呼び出すことができます。結果は 2^32 - 1 - 4 になります。

それを防ぎたいのですが、標準ライブラリの定数を使いたいです。uint32_t が保持できる最大数を表す size_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) ...リンクされた後に生成されたオブジェクト コードを監査するプロセスがない限り、このコードを符号付きの値で使用しないください。

-fwrapvgcc と clang では、このコードが符号付きの値に対して機能するようにオプションを追加する必要があります。他のコンパイラでは、走行距離が異なる場合があります。

これを行う適切な方法は、タイプ固有であり、 の定数を使用すること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

http://en.wikipedia.org/wiki/C_data_types#Fixed_width_integer_typesを確認#include <stdint.h>してください

あなたが探しているのはUINT32_MAX.

于 2012-11-30T14:12:30.887 に答える
2

C を使用している場合は、 limits.hを探しています。必要なマクロはUINT_MAX.

C++ の世界にいる場合は、std::numeric_limits<uint32_t>::max().

于 2012-11-30T14:10:05.373 に答える
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 に答える