👤

Napisz program, który zmiennej typu całkowitego przypisze wartość największej liczby całkowitej tego typu, a następnie doda do tej zmiennej 1 i wypisze jej wartość. Wykonaj ćwiczenia:
a)typu reprezentującego liczby całkowitego bez znaku
b)typu reprezentującego liczby całkowitego ze znakiem
C++


Odpowiedź :

Odpowiedź

Pierwszy załącznik zawiera program dla liczb całkowitych bez znaku (unsigned). Natomiast drugi zawiera wynik działania tego programu.

Trzeci załącznik zawiera program dla liczb całkowitych ze znakiem (signed). A czwarty wynik działania tego programu.

Wyniki z 2. załącznika pokazują, że dodanie 1 do największej liczby całkowitej bez znaku daje zero. Tak jest według ustaleń standardu C++. Na prawdę tak ma być. Podobnie (ale tylko podobnie!) jest z dodawaniem godzin. Czyli gdy masz godzinę 23:00 i dodasz jedną godzinę to dostajesz 0:00.

Jeżeli chodzi o dodanie 1 do największej liczby całkowitej ze znakiem, to wynik nie jest zdefiniowany przez standard języka C++. Różne kompilatory mają różne opcje pozwalające sprecyzować co ma się w takim przypadku stać. Nie napisałeś jakiego programu (środowiska) używasz do pisania w C++ tak więc nie mogę nic konkretniej napisać...

To co zamieściłam w załącznikach 2. oraz 4. jest wynikiem kompilacji i uruchomienia przy użyciu kompilatora  g++ (GCC) poza środowiskami  Code::Blocks,  Dev-C++  oraz  Visual Studio. Dodatkowo w piątym załączniku wynik uruchomienia przy pomocy kompilatora  clang.

W załącznikach 4. i 5. widać, że można sprawić aby program pokazał, że jest błąd (załącznik 5.) lub zakończył działanie w przypadku wystąpienia błędu (załączniki 4. oraz 5.). Akurat nie mam pod ręką wersji  g++  który ma działające obie te opcje, które ma  clang  z  replit.

Wyjaśnienie

Tak jak programy z pytania  brainly.pl/zadanie/21434013  te załączone tutaj działają pod  Code::Blocks,  Dev-C++  oraz  Visual Studio.  Natomiast tamte nie działają pod  Linuxem,  onlinegdb,  programiz,  replit  itd., a te działają.

Powyższa różnica jest dzięki wierszowi  #include <climits>.

Wprawdzie uważam, że użycie  printf()  jest dużo przejrzystsze, ale można być przyzwyczajoną do  cout, więc tym razem z  cout.

Wcale nie jest przypadkiem, że wyniki dla typów  long  oraz  unsigned long  są inne w tym zadaniu oraz w  brainly.pl/zadanie/21434013  ! ! !

Otóż standard C++ wcale dokładnie nie definiuje ile bajtów mają zajmować zmienne typów całkowitych... Ciekawe jest też to, że wyniki mogą być różne nawet jeśli został użyty ten sam kompilator, co najłatwiej porównać używając  g++.  Otóż  Code::Blocks  oraz  Dev-C++  używają  g++,  tylko że robią to inaczej. Skomplikowane? Tak. Dlatego lepiej nie używać typów  long  oraz  unsigned long  i ograniczyć się do typów int oraz  long long  (i ich wersji bez znaku).

Zobacz obrazek 0AB
Zobacz obrazek 0AB
Zobacz obrazek 0AB
Zobacz obrazek 0AB
Zobacz obrazek 0AB