Aufgabe mit union - Verbund



  • So hier mal eine Aufgabe an der ich ne ganze Weile gessen habe und zu keinen vernünftigen Ergebnis gekommen bin. Vielleicht kommt ihr ja drauf was man in die Kommentarzeilen setzten muss. Hier die ganze Aufgabe:

    Bei einer 16 Bit großen Speicherzelle umfasst das Low Byte die obersten Bits von 0 bis 7 und das High Byte die Bits 8 bis 15.

    Untersuchen Sie das nachfolgende Programmfragment um ergänzen Sie es um die Definition aller erforderlichen benutzerdefinierten Typen:

    #include <iostream>
    using namespace std;
    
    // ...
    
    int main() {
        if (sizeof(unsigned short int) != 2) {
            cout << "Unpassende Groesse von \"unsigned short int\" ungleich 2\n"
                 << "Programm abgebrochen."
                 << endl;
                 return 1;
        }
        Umwandlung u;
        cout << "unsigned short int-Wert: ";
        cin >> u.ganzzahl;
        cout << "High Byte: "
             << u.bytes.highByte - 0
             << "\nLow Byte: "
             << u.bytes.lowByte + 0
             << endl;
        return 0;
    }
    

    Wenn Sie das korrekt vervollständigte Programm übersetzen und ausführen, gibt es das High Byte und das Low Byte eines einzugebenden unsigned short int-Wertes aus, zum Beispiel:
    unsigned short int-Wert: 32799
    Low Byte: 31
    High Byte: 128

    Senden Sie das vollständige Quellprogramm als Lösung ein.



  • Ich weiß nicht genau wie sich der Aufgaben Steller das vorstellt, aber ich würde es so lösen:

    #include <iostream>
    using namespace std;
    
    class Umwandlung
    {
        private:
            unsigned char data[2];
        public:
            Umwandlung(unsigned short int was)
            {
                data[0] = *(reinterpret_cast<unsigned char*>(&was));
                data[1] = *(reinterpret_cast<unsigned char*>(&was) + 1);
            }
            unsigned char HighByte()
            {
                return data[0];
            }
            unsigned char LowByte()
            {
                return data[1];
            }
    };
    
    int main() {
        if (sizeof(unsigned short int) != 2) {
            cout << "Unpassende Groesse von \"unsigned short int\" ungleich 2\n"
                 << "Programm abgebrochen."
                 << endl;
                 return 1;
        }
        Umwandlung *u;
        cout << "unsigned short int-Wert: ";
        unsigned short int t;
        cin >> t;
        u = new Umwandlung(t);
        cout << "High Byte: "
             << static_cast<int>(u->HighByte())
             << "\nLow Byte: "
             << static_cast<int>(u->LowByte())
             << endl;
        delete u;
        return 0;
    }
    


  • union Umwandlung 
    {
        unsigned short ganzzahl;
        struct {
            char highByte;
            char lowByte;
        } bytes;   
    };
    

    Sowas ist wohl gefragt.



  • Knapp daneben 😉

    union Umwandlung
    {
       unsigned short ganzzahl;
       struct {
          unsigned char lowByte;
          unsigned char highByte;
       }bytes;  
    };
    

    Kurt



  • Danke erstmal für die schnelle Antwort. Jetzt geht es! 🙂



  • Die struct brauchst du nicht.
    FireFlow's Lösung war fast richtig. Siehe mein voriges Posting
    Kurt


Anmelden zum Antworten