2016-12-06 14 views
2

У меня есть задание в университете, где мне нужно написать функции для данной основной программы. Это все в c.C Программирование - использование по модулю суммы целых без знака, которые переполняются

Итак, моя проблема в том, что мне нужно использовать модуль из суммы двух целых без знака.

uint32_t mod_add(uint32_t x, uint32_t y, uint32_t n) 
{ 
    uint32_t res; 

    res = (x + y) % n; 

Это прекрасно работает, когда сумма х и у ниже 2^32-1. Моя проблема в том, что, когда сумма превышает это значение, она явно переполняется, а значение по модулю ошибочно.

В моем назначении x = 2^32-3; y = 1174501 и n = 2^32-1 (n - по модулю); Мой результат: 1174497, это должно быть 1174499.

У кого-нибудь есть идеи, как это решить?

+2

попробуйте 'res = ((uint64_t) x + y)% n;' вместо. – BLUEPIXY

+0

да .... не разрешено использовать 64-битный ... вот в чем проблема. –

ответ

2

Здесь вы находитесь.

uint32_t remainder(uint32_t x, uint32_t y, uint32_t d) 
{ 
    uint32_t r1 = x % d; 
    uint32_t r2 = y % d; 

    return r1 < (d - r2) ? r1 + r2 : r1 - (d - r2); 
} 

Конечно вместо uint32_t вы можете использовать любой тип целого числа, как, например unsigned long long.

+0

Может быть, '(r1 + r2) izlin

+2

@izlin r1 + r2 может привести к переполнению. Таким образом, вы будете иметь дело с той же оригинальной проблемой. –

+0

правый, уже забыл, что мало факта. Спасибо! – izlin

 Смежные вопросы

  • Нет связанных вопросов^_^