2012-09-02 15 views
11

Dla int a, b, wiem, że gdy jest dokładnie jeden z a i b jest ujemny, wynik a/b i a % b jest zależny od komputera. Ale czy zawsze mam (a/b * b) + a % b == a, gdy b nie jest zero?Czy zawsze mam `(a/b * b) + a% b == a`, gdy b nie jest zerem?

+0

Co masz na myśli przez "zawsze mieć" i jakie typy są a b –

+0

W rzeczywistości, jeśli typ jest typu bez znaku, równość zawsze występuje, gdy "b" jest niezerowe. –

Odpowiedz

18

C++ 11 §5.6 [expr.mul]/4 stanowi:

Jeżeli iloraz a/b się przedstawić w rodzaju rezultacie (a/b)*b + a%b jest równa a.

C11 §6.5.5/6 określa samo z nieco innym frazowania:

Jeżeli iloraz a/b się przedstawić wyrażenie (a/b)*b + a%b równa a; w przeciwnym razie zachowanie obu a/b i a%b jest niezdefiniowane.

+2

Należy zauważyć, że klauzula "jeśli iloraz jest reprezentowalny" jest niezbędna. Na przykład, jeśli 'a == INT_MIN' i' b == - 1', równość jest fałszywa (a zachowanie jest niezdefiniowane). –

+0

@R .. - jest to prawdą dla reprezentacji dwóch uzupełnień, ale nie dla wielkości znaku. Nie jestem pewien co do ich uzupełnienia. Wszystkie trzy są poprawnymi reprezentacjami całkowitymi dla C i C++. –

+0

Przepraszam, miałem na myśli, że jest to ogólnie nieprawda, ponieważ dwójka uzupełnień jest możliwa. Jest to również fałszywe w praktyce, ponieważ implementacje uzupełniania i podpisu/magnitudy nie istnieją. –

Powiązane problemy