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++ は何ですか?
最も一般的な解決策は、増加した値が実際に前の値よりも大きいかどうか、または減少した値が前の値よりも小さいかどうかを確認することです。これは、値が符号なしの場合にのみ機能します 、変数のサイズとは関係なく、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;
}
}
<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)