我发现最通用的解决方案是检查增加的值是否实际上大于先前的值,或者减少的值是否小于先前的值。这仅在值是 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;
}
}