我該如何重寫這個測試,以便測試本身不會溢出?我可以使用(size_t) -1
爲單數(2的冪減1)的事實嗎?如何測試n/2 * 3 + n%2 * 2是否會溢出?
size_t size;
...
if ((size * 3U + 1U)/2U > (size_t) -1) {
/* out of address space */
}
編輯:對不起,我的問題的標題是錯誤的。我不想檢查(n * 3 + 1)/2
是否會溢出,但是如果n/2 * 3 + n % 2 * 2
會。我改變了標題。感謝您對錯誤問題的正確答覆。
'size'的類型是什麼? – pburka
你可以使用比'size'類型更大的類型嗎? – zch
如果'(n * 3 + 1)/ 2'溢出,那麼'n * 3 + 1'也會溢出。所以你可以檢查'n>(SIZE_MAX - 1)/ 3'。 – 2013-10-26 21:24:19