我正在使用C++编写程序,以找到所有满足ab=c的解,其中a、b和c一起使用所有数字0-9,每个数字仅使用一次。该程序循环遍历a和b的值,并每次在a、b和ab上运行数字计数例程,以检查是否满足数字条件。
然而,当ab超出整数限制时,会生成虚假的解。最终我使用类似以下代码来检查这种情况:
unsigned long b, c, c_test;
...
c_test=c*b; // Possible overflow
if (c_test/b != c) {/* There has been an overflow*/}
else c=c_test; // No overflow
有没有更好的方法来测试溢出?我知道一些芯片在溢出发生时会设置内部标志,但我从未在C或C++中看到它被访问过。
请注意,在C和C++中,带符号int
溢出是未定义行为,因此您必须在不实际引起溢出的情况下进行检测。关于加法之前的带符号整数溢出,请参见Detecting signed overflow in C/C++。
-ftrapv
将导致在(有符号)整数溢出时生成一个SIGABRT信号。详见此处。 - nibotclz
指令或__clz(unsigned)
函数来确定数字的等级(其最高位在哪里)。由于我不确定这是否适用于x86或x64,因此我假设它不可用,并且说找到最高有效位将需要最多log(sizeof(int)*8)
条指令。 - nonsensickle