int32_t result = registers[rs] + registers[rt];
if (((registers[rs] > 0) && (registers[rt] > 0) && (result < 0)) ||
((registers[rs] < 0) && (registers[rt] < 0) && (result > 0))) {
fprintf(stderr, "arithmetic overflow\n");
} else {
registers[rd] = result;
}
只需简单的添加并检测溢出,如果
registers[rs]
是2147483647并且registers[rt]
是1,registers[rd]
将得到-2147483648的结果。但是如果我在 printf("%d\\n", result)
和 rs
中声明具有相同值的变量结果后添加 rt
,它将显示算术溢出
当
registers[rs]
为2147483647且registers[rt]
为1时,应该输出算术溢出
int32_t result = registers[rs] + registers[rt];
当有符号整数溢出发生时,它会调用 UB(未定义的 Bahaviour)。
在添加这些整数之前您需要进行检查。
bool willOverflow(int32_t a, int32_t b)
{
bool overflow = false;
if (a > 0 && b > 0 && (a > INT32_MAX - b))
{
overflow = true;
}
else if (a < 0 && b < 0 && (a < INT32_MIN - b))
{
overflow = true;
}
return overflow;
}