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