Witam, mam za zadanie zamienić dane binarne reprezentujacę liczbę float na typ całkowito-liczbowy i za bardzo nie wiem jak się za to zabrać. Pamiętam, że prowadzący wspominał coś o wskaźnikach i adresach. Z góry dziękuję za pomoc. Program piszę w języku C.

- Rejestracja:ponad 11 lat
- Ostatnio:prawie 2 lata
- Postów:607
No tak. To chodzi Ci, że dostaniesz mantyse i ceche i zmieniasz to na liczbę?
Czy masz wskaźnik do float i z niego wyłuskujesz mantysę i cechę i wtedy zamieniasz to na liczbę?
Chodzi o to zeby pokazać właśnie te dwie rozne wartosci na wskaznikach tego nie rozumiem
Chodzi o coś takiego?
void *ptr = coś;
printf( "float: %f\nint: %d", *ptr, *ptr );

- Rejestracja:ponad 13 lat
- Ostatnio:około 5 lat
- Lokalizacja:Wrocław
- Postów:292
Najprościej:
http://en.cppreference.com/w/cpp/language/union

- Rejestracja:około 22 lata
- Ostatnio:ponad rok
Przy pomocy wskaźników - undefined behavior w C i C++. Można to "obejść" wyłączając strict aliasing w kompilatorze ale to nie jest dobre rozwiązanie. (W GCC -fno-strict-aliasing
)
Przy pomocy unii - undefined behavior w C++, z pewnością well defined w >=C99 jeżeli typy mają takie same rozmiary. Ponadto np. GCC gwarantuje, że w C++ to też będzie działać.
Bezproblemową metodą działająca zawsze i wszędzie powinno być memcpy
.

- Rejestracja:ponad 13 lat
- Ostatnio:około 5 lat
- Lokalizacja:Wrocław
- Postów:292
Rozpisując się:
O typie float nie można nawet powiedzieć, że jest zmiennoprzecinkowy. Nie ma takiej gwarancji. Niektóre kompilatory gwarantują, że jest to 32-bitowa liczba zmiennoprzecinkowa (IEEE-754). Przy pomocy unii można zrobić to w ten sposób:
#include <cinttypes>
#include <iostream>
union intFloat {
uint32_t Int;
float Float;
intFloat (uint32_t i) : Int(i) { }
intFloat (float f) : Float(f) { }
};
int main () {
uint32_t intV = 1;
intFloat iVU = intFloat(intV);
float floatV = 1.0;
intFloat fVU = intFloat(floatV);
std::cout << iVU.Int
<< '\n'
<< iVU.Float
<< '\n'
<< fVU.Int
<< '\n'
<< fVU.Float
<< std::endl;
}
Lub przez memcpy:
#include <cinttypes>
#include <iostream>
#include <cstring>
#ifndef __STDC_IEC_559__
#error "Size of float might not equal 32bit"
#endif
int main () {
uint32_t intV = 1;
float floatV;
memcpy (&floatV, &intV, sizeof(int));
std::cout << intV
<< '\n'
<< floatV
<< std::endl;
}

- Rejestracja:ponad 12 lat
- Ostatnio:ponad rok
- Postów:111
float f = 2.0f;
int i = *(int*)&f;



Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.
float
idouble
to SĄ typy zmiennoprzecinkowe i to standard gwarantuje.