LINUX.ORG.RU

a+b и переполнение


0

0

Изучаю С. Встретил такой вопрос, и никак не могу понять код, предлагаемый в качестве решения.

Есть три int'a (a, b, limit). Сумма 'a' и 'b' не должна быть больше limit, в противном случае 'a' должен быть таким, что a+b=limit. Предлагается такой вариант решения:

if (b < 0)
{
  if (limit <= INT_MAX + b)
     if (limit - b < a)
       a = limit - b;
} else {
    if (limit < INT_MIN + b)
      goto end;
    if (limit - b < a)
      a = limit - b;
}

Т.е. судя по всему пытаются определить чтобы не было переполнения a+b? Как я понимаю, нельзя делать просто так: if (a+b > limit) ... по причине возможного переполнения?

И в чем польза от «if (limit <= INT_MAX + b)» (я в курсе что такое INT_MAX/MIN, но в чем их смысл здесь в данном случае)?

★★

Потому что надо решить такое неравенство a+b > limit, где a,b,limit E [INT_MIN, INT_MAX]

anonymous
()

> Есть три int'a (a, b, limit). Сумма 'a' и 'b' не должна быть больше limit, в противном случае 'a' должен быть таким, что a+b=limit.

if ((limit-b) < a) { ... } else { ... }

anonymous
()

if (limit < INT_MIN + b) goto end;

goto end;

goto


Не читай больше эту книгу.

А вообще:

int a,b;
int c = a + b;
if((c>limit)||(c<a)||(c<b)) a = limit - b;

anonymous
()
Ответ на: комментарий от anonymous

>if ((limit-b) < a) { ... } else { ... }

limit == INT_MIN + 1 b == 2 a == 7 (limit-b < a) == false

PROFIT???

anonymous
()

А вы книгу Hacker's Delight, Уоррена открывали? Есть русский перевод - Алгоритмические трюки для программиста. Информация оттуда вам поможет.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.