P006 - Podgląd liczb rzeczywistych
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: P006
//--------------------------

#include <iostream>

using namespace std;

// Funkcja wypisuje binarnie młodszy bajt argumentu
//-------------------------------------------------
void piszBajt(int x)
{
  for(int m = 128; m; m >>= 1) cout << ((m & x) ? 1 : 0);     
}

main()
{
  double x = 3.1;
  char * p; // to jest deklaracja wskaźnika do obiektów typu char
  
  p = (char *) &x; // do wskaźnika p wpisujemy adres x potraktowany jako adres obiektu typu char
  cout << "Liczba FP = " << x << endl << endl;
  for(int i = 1; i <= 8; i++)
  {
    cout << "Bajt nr " << i << " = ";
    piszBajt((int)(* p++)); // wypisujemy binarnie kolejny bajt z obszaru zmiennej x
    cout << endl;
  }
  cout << endl;
  system("pause");
}

 

Widok okienka konsoli w uruchomionym programie
Liczba FP = 3.1

Bajt nr 1 = 11001101
Bajt nr 2 = 11001100
Bajt nr 3 = 11001100
Bajt nr 4 = 11001100
Bajt nr 5 = 11001100
Bajt nr 6 = 11001100
Bajt nr 7 = 00001000
Bajt nr 8 = 01000000

       Wyjaśnienie

Program demonstruje swobodę w stosowaniu wskaźników. Tutaj podglądamy wewnętrzną strukturę w pamięci liczby typu double. W okienku konsoli widzimy kolejne bajty tej liczby. Dostęp do tej informacji uzyskaliśmy za pomocą wskaźnika do typu char (bajty), do którego wprowadziliśmy adres zmiennej typu double. Operacja ta wymagała rzutowania, ponieważ język C++ bardzo ściśle kontroluje przypisania do wskaźników:

p = (char *) &x; // do wskaźnika p wpisujemy adres x potraktowany jako adres obiektu typu char

Mając adres we wskaźniku potraktowaliśmy obszar pamięci zajmowany przez zmienną x jak obszar komórek 1 bajtowych. Odczytaliśmy je kolejno, zamieniliśmy na system binarny, aby zobaczyć poszczególne bity i wynik wyświetliliśmy w oknie konsoli.

Powyższa metoda pozwala "włamywać się" do wszelkich struktur danych w celu wykonania nietypowych operacji (np. odczytu ich zawartości w inny sposób niż normalnie). Jest bardzo potężna i równocześnie bardzo niebezpieczna. Dlatego należy zawsze stosować ją z pełnym zrozumieniem i dużą ostrożnością.



List do administratora Serwisu Edukacyjnego Nauczycieli I LO

Twój email: (jeśli chcesz otrzymać odpowiedź)
Temat:
Uwaga: ← tutaj wpisz wyraz  ilo , inaczej list zostanie zignorowany

Poniżej wpisz swoje uwagi lub pytania dotyczące tego rozdziału (max. 2048 znaków).

Liczba znaków do wykorzystania: 2048

 

W związku z dużą liczbą listów do naszego serwisu edukacyjnego nie będziemy udzielać odpowiedzi na prośby rozwiązywania zadań, pisania programów zaliczeniowych, przesyłania materiałów czy też tłumaczenia zagadnień szeroko opisywanych w podręcznikach.



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

©2017 mgr Jerzy Wałaszek

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