我有一些关于x86或x86_64体系结构上的划分溢出错误的问题。最近,我一直在阅读有关整数溢出的知识。通常,当算术运算导致整数溢出时,将置位FLAGS寄存器中的进位或溢出位。但是很显然,根据本文所述,除法运算导致的溢出不会设置溢出位,而是会触发硬件异常,类似于将其除以零时的情况。
现在,除法导致的整数溢出比乘法要少得多。只有几种方法可以触发除法溢出。一种方法是做类似的事情:
int16_t a = -32768;
int16_t b = -1;
int16_t c = a / b;
在这种情况下,由于带符号整数的二进制补码表示形式,因此无法在带符号的16位整数中表示正32768,因此除法运算会溢出,从而导致-32768的错误值。
几个问题:
1)与本文所说的相反,以上内容并未引起硬件异常。我正在使用运行Linux的x86_64机器,当我除以零时,程序以Floating point exception终止。但是,当我导致除法溢出时,程序照常继续运行,而忽略了错误的商。那为什么不引起硬件异常呢?
2)为什么除硬件运算如此严重地处理除法错误,而不是其他算术溢出?为什么硬件应该默默地忽略乘法溢出(很有可能偶然发生),但是应该认为除法溢出会触发致命中断?
===========编辑==============
好的,谢谢大家的回答。我得到的答复基本上是说