0

我正在使用带符号的 16 位宽变量。当加法,减法等时,我可以通过以下方式检测进位和溢出:

我将结果存储在一个 32 位宽的变量中,然后检查第 17 位(0-16 位代表值,如果有进位或溢出,第 17h 位应该是 1 - 溢出)?如果它是一个那么它是一个溢出/进位,如果它是零 - 它不是。使用 16b 值时是否可以进位而不溢出,反之亦然?

我搜索了 StackOverflow,但我无法找到我的问题的明确答案。

4

1 回答 1

0

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 上调用它们可能会失败。

于 2014-08-17T13:18:30.197 回答