[C++] Rzutowanie wskaźników


(John Clawe) #1

Witam serdecznie,

Nurtuje mnie ostatnio pewien problem, z którym nie mogę sobie poradzić.

Może ktoś doradzi jak zmodyfikować poniższy kod aby wynik działania funkcji był poprawny:

#include 

using namespace std;


float funkcja(float *wskaznik)

{ return (*wskaznik + *wskaznik); }


int main()

{	

	int *wskaznik = new int;	

	*wskaznik = 5;

	cout << funkcja(reinterpret_cast(wskaznik));

}

(Drobok) #2

A co ma zwracać funkcja ?


([alex]) #3
float funkcja(float *wskaznik) { return 2*(*reinterpret_cast(wskaznik)); }

(Rolek0) #4

Przede wszystkim, co rozumiesz jako poprawny wynik? Podałeś tylko kawałek kodu o wątpliwej sensowności, z którego nic nie wynika.

int i float mają różne kodowania (najcześciej U2 dla int oraz IEEE 754 single dla float).

int 5 binarnie wyglada tak:

00000000000000000000000000000101

Interpretując to jako float dostajesz dodatnią liczbę zdenormalizowaną o wartości 5 * 2**(-149) (** oznacza potęgowanie), dodając dwie takie liczby do siebie dostaniesz 10 * 2**(-149), która też, z powodu małej wartości, jest zdenormalizowana; szczęśliwym zbiegiem okoliczności(wykładnik nadal zerowy) po zinterpretowaniu jej reprezentacji binarnej jako int otrzymasz 10 :wink:


(John Clawe) #5

Dziękuję wszystkim za rady i informacje.

Oczywiście chciałem aby funkcja zwracała wynik 10.

Faktycznie kod nie jest elementem programu, a jedynie przykładem tego co trzeba zrobić.

W tym przypadku nie mogę modyfikować funkcji.

Zadaniem jest taka zmiana linii z wywołaniem funkcji aby uzyskać poprawny matematcznie wynik.

cout << funkcja(reinterpret_cast(wskaznik));

([alex]) #6

float f=5;

cout << funkcja(&f);

albo:

cout << funkcja(&(reinterpret_cast(*wskaznik)=*wskaznik)); / z tym że to bezsensowne zadanie zakładające że fłoat ma ten sam rozmiar co int.