2016-12-06 4 views
2

J'ai une affectation à l'université, où j'ai besoin d'écrire des fonctions pour un programme principal donné. Tout est dans c. Donc, mon problème est que j'ai besoin d'utiliser le module d'une somme de deux entiers non signés.C Programmation - en utilisant modulo d'une somme d'entiers non signés qui déborde

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

    res = (x + y) % n; 

Cela fonctionne bien, lorsque la somme de x et y est inférieure à 2^32-1. Mon problème est que lorsque la somme est supérieure à cette valeur, elle déborde évidemment et la valeur modulo est erronée.

Dans mon affectation x = 2^32-3; y = 1174501 et n = 2^32-1 (n est le modulo); Mon résultat est 1174497, il devrait être 1174499.

Quelqu'un a une idée, comment résoudre ce problème?

+2

essayez 'res = ((uint64_t) x + y)% n;' au lieu de. – BLUEPIXY

+0

ouais .... pas autorisé à utiliser 64bit ... c'est le problème. –

Répondre

2

Vous y êtes.

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); 
} 

Bien sûr, au lieu de uint32_t vous pouvez utiliser un type entier comme par exemple unsigned long long.

+0

Peut-être '(r1 + r2) izlin

+2

@izlin r1 + r2 peut entraîner un débordement. Donc, vous allez faire face au même problème original. –

+0

droite, déjà oublié ce petit fait. Je vous remercie! – izlin