P001 - przekroczenie zakresu liczby całkowitej bez znaku
Program uruchomiono w środowisku Bloodshed Dev-C++ 4.9.9.2
// I Liceum Ogólnokształcące
// im. K. Brodzińskiego
// w Tarnowie
//--------------------------
// Koło informatyczne 2006/7
//--------------------------
// Program: P001
//--------------------------

#include <iostream>
#include <iomanip>

using namespace std;

main()
{
  unsigned a,b,c;

  a = 3000000000uL;
  b = 2000000000uL;
  c = a + b; // wynik nie mieści się w zakresie
  cout << "\na = " << setw(10) << a 
       << "\nb = " << setw(10) << b
       << "\nc = " << setw(10) << c << endl << endl;
  system("pause");
}

 

Widok okienka konsoli w uruchomionym programie
a = 3000000000
b = 2000000000
c =  705032704

       Wyjaśnienie

Typ danych unsigned odnosi się w języku C++ do 32-bitowych liczb całkowitych bez znaku. Wynik dodawania przekracza 32-bity i zostaje obcięty - tracimy najstarszy bit. Dlatego w zmiennej c otrzymujemy liczbę 705032704 zamiast spodziewanej liczby 5000000000.

 

3000000000(10) = 10110010110100000101111000000000(2) =  3000000000(10)
+ 2000000000(10) =  + 01110111001101011001010000000000(2) =  2000000000(10)
5000000000(10) =  100101010000001011111001000000000(2) =  705032704(10)

 

Dokładny opis liczb całkowitych bez znaku znajdziesz w artykule o binarnym kodowaniu liczb.


   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2024 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe