3
程序將生成階乘數,直到它發生溢出。表達式r <= UINT_MAX/j
用於檢測溢出。現在,如果我將表達式重寫爲r * j <= UINT_MAX
,它將進入無限循環。我的問題不是關於如何檢測整數溢出。這就是表達式讓流程進入無限循環的原因。帶有無符號整數溢出檢測的表達式
for (unsigned i = 0;;++i) {
unsigned r = 1;
for (unsigned j = 2; j <= i; ++j) {
if (r <= UINT_MAX/j)
r *= j;
else {
printf("Overflow!\n");
}
}
}
表達式'r * j'也是一個無符號整數。所以它永遠不會比'UINT_MAX'大。 – wimh
可能重複的[在整數加法溢出測試](http://stackoverflow.com/questions/3422709/test-for-overflow-in-integer-addition) – wimh
可能重複[如何檢測整數溢出在C/C++?](http://stackoverflow.com/questions/199333/how-to-detect-integer-overflow-in-cc) –