Hallo Nama,
Da ich die Lösung dringend bis morgen brauche, möcht ich mich gerne mit Pralinen bedanken für eine Antwort.
Ok - die Pralinen kann ich mir nicht mehr verdienen; aber ich antworte trotzdem: Du schreibst in der Überschrift, dass Du das Programm in C++ machen sollst. Dein Code ist aber reinstes C! Aus dem Define '_CRT_SECURE_NO_WARNINGS' (obwohl hier völlig unnötig!) schließe ich, dass Du das Visual Studio von Microsoft benutzt, welches C++-fähig ist. Der Define hat auch nur unter C++ überhaupt Wirkung!
Deshalb hier eine C++-Lösung Deiner Aufgabe:
#include <cstdint> // std::uint32_t
#include <iostream> // cout, endl
std::ostream& print_bits(std::ostream& out, std::uint32_t x, int von, int bis)
{
for(int iBit =bis; iBit >= von; --iBit)
{
out << ((x >> iBit) & 1);
}
return out;
}
int main()
{
using namespace std;
static_assert(sizeof(float) == 4, "das Programm setzt einen Typ 'float' mit 32 Bit voraus");
for (float fgo; cout << "> ", cin >> fgo; )
{
uint32_t* pia = reinterpret_cast<uint32_t*>(&fgo);
uint32_t ix = *pia;
print_bits(cout << "Vorzeichen: ", ix, 31, 31) << endl;
print_bits(cout << "Exponent: ", ix, 23, 30) << endl;
print_bits(cout << "Mantisse: ", ix, 0, 22) << endl;
}
return 0;
}
meine Ausgabe ist dann:
> -1.1
Vorzeichen: 1
Exponent: 01111111
Mantisse: 00011001100110011001101
> 1.1
Vorzeichen: 0
Exponent: 01111111
Mantisse: 00011001100110011001101
> -2.2
Vorzeichen: 1
Exponent: 10000000
Mantisse: 00011001100110011001101
>
Wenn man \(1.1\) statt \(-1.1\) eingibt, so ändert sich nur das Vorzeichen und verdoppelt man den Wert zu \(-2.2\), so ändert sich der Exponent um 1. Siehe auch IEEE 754.