Эта проблема
Я думал о целочисленных (тип int) переполнениях, и мне пришло в голову, что деление может переполняться.
Пример: на моей текущей платформе у меня
INT_MIN == -INT_MAX - 1
и поэтому
INT_MIN < -INT_MAX
и поэтому
INT_MIN / -1 > -INT_MAX / -1
и поэтому
INT_MIN / -1 > INT_MAX.
Следовательно, деление (INT_MIN / -1) действительно переполняется.
Вопросы
Итак, у меня два вопроса:
Какой (кросс-платформенный) код C можно было написать, чтобы предотвратить переполнение деления (для типа (подписанного) int)?
Какие гарантии (в стандарте C или C ++) могут помочь при разработке кода?
Например, если стандарт гарантирует, что у нас есть либо
INT_MIN == -INT_MAX - 1
or
INT_MIN == -INT_MAX,
то появляется следующий код для предотвращения переполнения.
#include <limits.h>
/*
Try to divide integer op1 by op2.
Return
0 (success) or
1 (possibly overflow prevented).
In case of success, write the quotient to res.
*/
int safe_int_div(int * res, int op1, int op2) {
/* assert(res != NULL); */
/* assert(op2 != 0); */
if ( op1 == INT_MIN && op2 == -1 ) {
return 1;
}
*res = op1 / op2;
return 0;
}
-1
при ошибке. - person alk   schedule 22.05.2015if (!op2) return 2
:) - person Sir Jo Black   schedule 22.05.2015