我正在使用带符号的 16 位宽变量。当加法,减法等时,我可以通过以下方式检测进位和溢出:
我将结果存储在一个 32 位宽的变量中,然后检查第 17 位(0-16 位代表值,如果有进位或溢出,第 17h 位应该是 1 - 溢出)?如果它是一个那么它是一个溢出/进位,如果它是零 - 它不是。使用 16b 值时是否可以进位而不溢出,反之亦然?
我搜索了 StackOverflow,但我无法找到我的问题的明确答案。
upd:当操作数在执行操作时针对限制(在limits.h中声明)进行测试时,可以使用方法。例如看看这个“安全”的添加功能:
int safe_add(int x, int y)
{
if(y < 0)
return save_sub(x, -y);
if(x > (INT_MAX - y))
{
printf("overflow\n");
return INT_MAX;
}
return x + y;
}
int save_sub(int x, int y)
{
if(y < 0)
return save_add(x, -y);
if(x > (INT_MIN + y))
{
printf("underflow\n");
return INT_MIN;
}
return x - y;
}
注意:这些方法至少有一个错误:如果在最大的负整数 INT_MIN 上调用它们可能会失败。