Char-Variable als Dualzahl ausgeben (Bitweise)



  • Hallo,

    Ein char hat ja 8 Bit. 1 Bit ist entweder 1 oder 0.

    Wenn ich jetzt sage:

    char a = 00000001;
    printf("%d",a);

    Gibt das Programm "1" aus. Stimmt also. Sage ich aber:

    char a = 11111111; //Was im Dezimalsystem ja für 255 steht
    printf("%d",a);

    Gibt das Programm "-57" aus....O.o Wieso das?
    Wie bekomme ich es hin, dass ich in einer (char) Variable eine Dualzahl zuweise und diese dann als Dezimalzahl (oder auch Dualzahl falls gewünscht) ausgeben lassen kann?



  • Nein, nein, das hast du falsch verstanden. 11111111 steht im Dezimalsystem für 11111111. Das auf einen char zusammengestrichen ergibt bei dir halt -57 (woraus man schließen kann, dass char bei dir vorzeichenbehaftet ist), wobei der Wert natürlich nicht vom Standard garantiert ist -- Overflows sind nur für vorzeichenlose Typen definiert.

    Meinst du möglicherweise

    char a = '\xff'; /* ff hexadezimal */
    

    Das wird allerdings in einen int umgewandelt mit einiger Wahrscheinlichkeit auch nicht 256 sein, weil ein vorzeichenbehafteter char nur Werte zwischen -128 und 127 darstellen kann.



  • Und wie kriege ich mein oben beschriebenes Vorhaben umgesetzt?



  • Binärliterale gibt es in C nicht, also gar nicht. Schreib's halt hexadezimal, das musst du sowieso irgendwann lernen. Ansonsten gibt es in Boost.Utility ein Makro BOOST_BINARY, das so was auf Präprozessorbasis zusammenschustert, aber ich weiß nicht, ob ein C-Compiler das frisst.

    Wenn du einen Wertebereich von 0 bis 256 brauchst, musst du unsigned char anstelle von char nehmen.

    Wenn es dir nicht darum geht, den Compiler dazu zu bringen, Binärzahlen zu interpretieren, sondern du Benutzereingaben umwandeln willst oder es dich nicht stört, Stringliterale erst zur Laufzeit zu parsen, gibt es in <stdlib.h> Funktionen strtol und strtoul, die beliebige Radixe verarbeiten können. Wenn du denen 2 als Basis übergibst, rechnen die dir Binärzahlen um.



  • John77 schrieb:

    Wie bekomme ich es hin, dass ich in einer (char) Variable eine Dualzahl zuweise und diese dann als Dezimalzahl (oder auch Dualzahl falls gewünscht) ausgeben lassen kann?

    Du kannst hierfür Compilererweiterungen nutzen, die nicht standardgemäß sind (es sind ja 'Erweiterungen'), der C Compiler der GNU Compiler Collection gcc bietet hier ein führendes "0b" an, also z.B.

    unsigned char c = 0b11111111;
    printf("%d",c);
    

    sollte mit gcc also zum gewünschten Ergebnis führen. Ansonsten schaue mal in die Dokumentation deines Compilers.

    char a = 00000001;
    printf("%d",a);
    

    Dein Beispiel führt hier nur zufällig zum gewünschten Ergebnis, eine führende "0" ohne "0x"/"0X" kennzeichnet ein Integerliteral als oktal, probiere also mal

    int a = 00000011;
    printf("%d",a);
    

Anmelden zum Antworten