Programm zum Ausgeben des größtmöglichen Werts integraler Datentypen



  • Um die interne Darstellung integraler Werte besser zu verstehen, versuchte ich ein Programm zu schreiben, der die im ersten Kommentar genannte Aufgabe erfüllen sollte.

    // Programm ermittelt größtmöglich darstellbaren Wert von integralen Datentypen
    
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
      int z1 = 0; // interne Darstellung: 16 od. 32 Nullen
      z1 = ~z1; // interne Darstellung von z1 nun: alles Einsen
    
      z1 = static_cast<unsigned int>(z1); // Der Datentyp von z1 wird zu unsigned z1  
    
      cout << z1 << endl; // größtmögliche unsigned-int-Zahl wird ausgegeben
    
      z1 = z1 >> 1; // grötmögliche signed-int Zahl...
      cout << z1; // ... wird ausgegeben
    
      cin >> z1; // Programm soll nicht nach Ausführung obiger Anweisungen schließen 
    }
    

    Die tatsächliche Ausgabe jedoch :
    -1
    -1

    Wo liegt mein Fehler?



  • Der Typ von "z1" ist immer noch "int" nicht "unsigned int", das wird bei der Ausgabe berücksicht.



  • Der Über- bzw Unterlauf von unsigned Typen ist im Standard festgelegt.

    UINT_MAX + 1 == 0
    bzw
    0 - 1 == UINT_MAX.



  • Dann stellt sich die Frage: wie gebe ich einer bestehenden Variablen einen anderen Datentyp?


  • Mod

    Dexter1997 schrieb:

    Dann stellt sich die Frage: wie gebe ich einer bestehenden Variablen einen anderen Datentyp?

    Gar nicht.

    Vermutlich stellst du die falsche Frage. Du willst doch wohl eher wissen, wie du aus -1 einen unsigned int erzeugen kannst. Was mit der vorherigen Variable geschieht, kann dir doch egal sein, oder? Zwei mögliche Antworten darauf wären:

    unsigned int z2 = z1;

    
    So einfach kann es sein. Arithmetische Datentypen werden automatisch ineinander umgewandelt.
    *  ```
    static_cast<unsigned int>(z1)
    

    So kannst du den Wert von z1 in einen unsigned umwandeln und damit rechnen. Was du bei dir falsch gemacht hast, ist, dass du den Wert danach gleich wieder einem (signed) int zugewiesen hast. Dabei wurde die Umwandlung sofort wieder rückgängig gemacht, siehe erste Methode.



  • Nein, das war tatsächlich mein Vorhaben. Aber danke für die Antwort, dann hab ich jetzt wenigstens Klarheit darüber.


  • Mod

    Es gibt prinzipiell auch Datentypen, die sich so verhalten, als ob sie variabel einer von mehreren (oder gar allen möglichen) anderen Datentypen wären. Sie bleiben dabei natürlich die ganze Zeit dieser Supertyp, aber man kann sie so benutzen, als ob sie veränderlich wären.


Log in to reply