使用这个算法来计算有符号整数的乘法(我们不能使用 mul、mulh 等,所以我用移位和加法实现了 mul),如何检查结果是否溢出。产品必须保持 32 位
我尝试使用一些溢出条件,例如(a * b = c):
但是,例如当 a = -3434421 和 b = -12555 时,程序无法理解它已经溢出。我想溢出的条件可能不正确。
看来你正在用 32 位进行这个算术。
但是两个 32 位数字相乘会产生 64 位结果(没有任何溢出的可能性)。
如果您只考虑答案的低 32 位,那么乘法就没有意义,因为有很多位被忽略。
这种查看低 32 位的方法仅适用于加法,之所以有效,是因为将两个 32 位数字相加会得到一个 33 位数字(没有任何溢出的可能性),因此将 33 位加法结果截断为32 位,我们仍然可以通过查看原始输入值来检测溢出。
要使用移位和加法方法检测乘法溢出,您必须在加法和左移以及每次迭代时检查溢出,然后尽早清除溢出或使溢出“粘性”,因此一旦设置它就可以设置它保持设置。
a < 0 and b < 0 c > 0 这意味着结果已经溢出
这个公式完全错误,因为 -1 × -1 = 1(所以 a<0, b<0, c>0),但这里没有溢出。