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ą.


   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