Różnica pomiędzy dodawaniem całkowitym a dodawaniem bez znaku.

0

Czym różni się dodawanie całkowite od dodawania bez znaku ?

4

signed overflow to UB, a w unsigned jest zdefiniowany jako wrap around.

Np.

3000000000 + 3000000000; // UB
3000000000u + 3000000000u; // 6000000000 % (UINT_MAX+1)
0

Co oznacza UB i wrap around?

3

Undefined behavior, czyli niezdefiniowane zachowanie. Jako programiście nie wolno Ci do tego dopuścić.

Wrap around - zawinięcie za maksymalną wartością. UINT_MAX + 1 == 0

0

Czyli w dodawaniu całkowitym dostaniemy nadmiar?

2

Będzie UB. Nie jest powiedziane co się stanie.

0

A jeśli przepełniłbym liczby bez znaku ?

1

To będzie wrap around.

0

W jakim sensie to zawinięcie?

4

Obcięte zostaną bity najbardziej po lewej, albo inaczej mówiąc, wartości będą zawsze modulo UINT_MAX+1. Tak jak pokazałem to wyżej:

3000000000u+3000000000u; // 6000000000 % UINT_MAX
UINT_MAX + 1 == 0;
UINT_MAX + 5 == 4;
0

Czyli w dodawaniu bez znaku przenosimy bity ?

2

w dodawaniu bez znaku dodajemy bez znaku, a potem obcinamy najwyższe bity (co jest jednoznaczne z operacją modulo UINT_MAX+1)

0

I z mnożeniem jest tak samo ?

2

Tak. Uprzedzając pytanie, wyjście poniżej minimalnej wartości też nazywa się overflowem (czyli duże wartości ujemne)

1 użytkowników online, w tym zalogowanych: 0, gości: 1