Frage zur Umwandlung arithmetischer Datentypen



  • Hallo Freunde,
    ich habe ein Verständnisproblem bei der Typumwandlung. Angenommen ich habe ein Variable, die nicht unter 0 gehen kann...also unsigned.
    Als Beispiel nehme ich den folgenden Code. Ist das so richtig?

    char k=22; // 00010110 -> char = 1 Byte
    unsigned int  z=k;  // 0000000000010110 -> auf 16 - Bit Systemen -> int = 2 Byte
    

    1.) Beschreibt hier auch die erste Null, das Vorzeichen. Wenn ja, warum? Es kann doch sowieso nicht uner Null gehen.

    Wenn ich nun ein Vorzeichen habe, dann schreibe ich das:

    //Binäre Schreibweise von -10 in char
    //so:
    10001010
    //oder so?:
    11111010
    

    2.) Ist nur die erste Zahl für das Vorzeichen zuständig oder alle Zahlen bis zu eigentlichen Zahl (dann könnte aber die Zahl doch gar nicht mehr herausgesucht werden, denn man könnte meinen, dass dies einfach eine riesen Zahl in Binärschreibweise ist).

    3.) Was beschreibt genau die Vorzeichenerweiterung? Ich verstehe die Erklärung in meinem Buch nicht.

    Vielen Dank für eure Hilfe
    lg, freakC++



  • Vielleicht hilft dir beim Verständnis der Artikel über das Zweierkomplement (ist übrigens nur eine von mehreren möglichen Darstellungen und z.B. in x86 angewandt).



  • freakC++ schrieb:

    Hallo Freunde,
    ich habe ein Verständnisproblem bei der Typumwandlung. Angenommen ich habe ein Variable, die nicht unter 0 gehen kann...also unsigned.
    Als Beispiel nehme ich den folgenden Code. Ist das so richtig?

    char k=22; // 00010110 -> char = 1 Byte
    unsigned int  z=k;  // 0000000000010110 -> auf 16 - Bit Systemen -> int = 2 Byte
    

    1 char = 1 byte per Definition. Aber keiner hat gesagt, dass char genau 8 Bits haben muss. Es müssen mindestens 8 sein, können aber mehr sein. Außerdem ist char entweder vorzeichenlos oder vorzeichenbehaftet (kommt auf Deinen Compiler, Deinen Rechner, Deine Optionen an). Es gibt übrigens 3 char-Typen: char, signed char, unsigned char. Siehe hier.

    freakC++ schrieb:

    1.) Beschreibt hier auch die erste Null, das Vorzeichen. Wenn ja, warum? Es kann doch sowieso nicht uner Null gehen.

    Nein, tut es nicht. Vorzeichenlose Ganzzahl-Typen haben eine festgelegte Binärdarstellung ohne "Vorzeichen".

    freakC++ schrieb:

    Wenn ich nun ein Vorzeichen habe, dann schreibe ich das:

    //Binäre Schreibweise von -10 in char
    //so:
    10001010
    //oder so?:
    11111010
    

    char ist nicht notwendigerweise vorzeichenbehaftet. Es kann also sein, dass ein Programm wie dieses

    char x = -10;
    int  y = x;
    cout << y;
    

    246 ausgibt. Das ist dann der Fall, wenn chars 8 Bit haben und char vorzeichenlos ist.

    Vorzeichenbehaftete Ganzzahlen können auf drei verschiedene aber vom Standard zulässige Arten abgelegt werden: 1er-Komplement, 2er-Komplement oder Sign+Magnitude. Dies ist implementierungsabhängig. Schau mal bei Wikipedia nach, wie das genau funktioniert.

    Gruß,
    SP



  • Hallo,
    vielen Dank für den Link. Ich werde mir den Artikel mal durchlesen. Dennoch wäre mir sehr geholfen, wenn mir jemand schon Antworten auf die gestellten Fragen geben könnte.
    Außerdem auch noch zu dieser:

    //Wie schreibe ich -5? 16-Bit System:
    
    int k=-5 //10000101 -> einfach die erste Zahl eins setzen für das negative Vorzeichen? oder:
    
    int k=-5 //11111101 -> alle Zahlen bis zur eigentlichen Zahl auf eins setzen?
    

    Wenn die zweite Lösung stimmt, wie kann der COmpiler die Zahl herausfinden, denn

    11111101 = 253 als Dezimalzahl

    Vielen Dank
    lg, freakC++

    @Sebastian Pizer:
    Vielen Dank für deine ausführliche Antwort. Aber: Meines Wissens kann char maximal nur 8 Bit haben, sonst wäre es doch kein char Wert. Dann könnte ich auch die Dezimalzahl 1000 in eine char Variable packen. Oder verstehe ich da was falsch?



  • freakC++ schrieb:

    [cpp]
    //Wie schreibe ich -5?

    Kommt auf das System an. 2er-Komplement? 1er-Komplement? Sign+Magnitude? Such Dir was aus.

    freakC++ schrieb:

    @Sebastian Pixer:
    Vielen Dank für deine ausführliche Antwort. Aber: Meines Wissens kann char maximal nur 8 Bit haben, sonst wäre es doch kein char Wert.

    Falsch.

    freakC++ schrieb:

    Dann könnte ich auch die Dezimalzahl 1000 in eine char Variable packen. Oder verstehe ich da was falsch?

    Es wäre denkbar, ja. Garantieren tut der Standard allerdings nur, dass char mindestens 8 Bit hat.

    Das, was der C bzw C++ Standard garantiert und das, was Dein C bzw C++ Compiler daraus macht (die "Implementierung des Standards", die Du benutzt) sind zwei verschiedene Dinge.

    Gruß,
    SP


Anmelden zum Antworten