character to integer cast

  • hi!

    bin gerade am progn mit c++ und hänge schon einige zeit.

    ich möchte die bitfolge eines characters (im konkreten fall 0xBF; dargestellt im hex editor mit '¿' - wie passend :shiner:) als dezimalzahl in eine integer variable schreiben. z.b. sollte beim buchstaben 'a' in der integer variable dann der dezimalwert 97 (binär: b110 0001) stehen (was auch so ist).
    führe ich mein programm aus so wird '¿' zu einem wert von dezimal -65, was bei einem signed interger dem binärwert von b1100 0001 entspricht. laut hex-editor entspricht dem '¿' jedoch ein 0xBF was wiederum b1011 1111 entspricht, sich also nicht der programmausgabe deckt.

    also hat es hier irgendwas mit dem casten auf sich, nur was wäre jetzt meine frage. wie gesagt, mir geht es darum, dass die bitfolgen übereinstimmen.

    hier der code. das schreiben in eine text datei tut hier glaub ich nichts zur sache.

    bin für jede hilfe dankbar!

    ...keep it simple, stupid ;)

  • Der int hat den Wert -65, weil schon der char den Wert -65 hat. Bei der Bitfolge b1011 1111 ist das oberste Bit gesetzt; char darf, je nach Belieben der Implementierung, signed oder unsigned sein. Bei dir ist es offenbar signed, also wird das oberste Bit als Vorzeichen-Bit interpretiert.

    Die einfachste Methode ist wohl, dein Zeichen zwischendurch kurz als unsigned char interpretieren zu lassen:

    Code
    int charToInt = (unsigned char) plainChar;


    (Ein expliziter Cast auf int ist unnötig.) So hat plainChar den Wert -65, aber die gesamte rechte Seite der Zuweisung hat den Wert 191, der landet dann auch im int.

    *plantsch*


  • führe ich mein programm aus so wird '¿' zu einem wert von dezimal -65, was bei einem signed interger dem binärwert von b1100 0001 entspricht.

    Was Plantschkuh schreibt, ist richtig, dies hier jedoch nicht. In der üblichen 2erkomplementdarstellung hat -65 genau die Darstellung 0xBF (in 8 Bit – bei 16 Bit würde es dann so aussehen: 0xFFBF, bei 32 0xFFFFFFBF usw.).

  • muchisimo gracias a todos! :thumb:

    ...ist mir zwar komplett neu, dass man so casten kann aber es funktioniert :yippie:

    Ringding:
    ...eine frage noch: warum (bzw zu welchem zweck) werden die restlichen bytes 0xFF gesetzt?

    ciao!

    ...keep it simple, stupid ;)

  • Code
    00011010(2) = 16 + 8 + 2 = 26
    10011010(2) = (−128) + 16 + 8 + 2 = −102

    ah, das MSB ist (bei 8 bit signed) -128 und nicht wie ich gedacht hätte -1 ...somit alles klar

    ...keep it simple, stupid ;)

  • muchisimo gracias a todos! :thumb:

    ...ist mir zwar komplett neu, dass man so casten kann aber es funktioniert

    Da eine int-Variable alle möglichen Werte einer char-Variablen annehmen kann, brauchst du nicht explizit auf int zu casten. Du musst nur, wie Plantschkuh gesagt hat, auf unsigned char casten, damit die char-Variable nicht als vorzeichenbehaftete Zahl interpretiert wird.

  • Interessant(er) ist ja die Frage, wie ein int-zu-char-Cast gehandhabt wird. Ich habe es mal, da ich auf diesem Computer keinen C/C++-Compiler installiert habe, mit Digital Mars D ausprobiert:

    Das Ergebnis war 255, also wurde das Lo-Byte genommen. Ist es im ANSI-Standard festgelegt, dass immer das Lo-Byte genommen wird, oder ist es von der Implementierung abhängig? (Ich könnte mir vorstellen, dass es von der Architektur - Big Endian vs. Little Endian - abhängig sein könnte.)

  • Interessant(er) ist ja die Frage, wie ein int-zu-char-Cast gehandhabt wird.


    char zählt dabei als "integer type". Punkt zwei ist umständlich, läßt sich aber als "modulo" aufs Wesentliche zusammenfassen. Punkt drei ist natürlich wenig zufriedenstellend; de facto wird dir wohl jede heutzutage verwendete Implementierung einfach das lower-order-Byte geben.

    n869 ist der letzte öffentliche Draft vom C99-Standard und mit dem endgültigen Standard fast identisch. Gibts hier: http://std.dkuug.dk/jtc1/sc22/wg14/www/docs/n869/

    *plantsch*

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!