1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

character to integer cast

  • fremder
  • 17. Januar 2009 um 03:41
  • Unerledigt
  • fremder
    3
    fremder
    Mitglied
    Reaktionen
    1
    Punkte
    71
    Beiträge
    11
    • 17. Januar 2009 um 03:41
    • #1

    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.

    Code
    ofstream out("test.txt");
    if(! out){
         cout<<"Cannot open output file\n";
    }
    
    
    char plainChar = '¿';  // ¿ ist in hex laut hex-Editor 0xBF
    int charToInt = (int) plainChar;
    // Ergebnis oberer Zeile: "-65    :(int) plainChar
    
    
    //unsigned int charToInt = (unsigned int) plainChar;
    // Ergebnis oberer Zeile: "4294967231    :(int) plainChar"
    out << charToInt << "\t:(int) plainChar" << endl;
    
    
    out.close();
    Alles anzeigen

    bin für jede hilfe dankbar!

    ...keep it simple, stupid :winking_face:

  • Plantschkuh!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    Punkte
    6.173
    Beiträge
    1.181
    • 17. Januar 2009 um 08:27
    • #2

    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*

  • Ringding
    11
    Ringding
    Mitglied
    Reaktionen
    12
    Punkte
    1.237
    Beiträge
    244
    • 17. Januar 2009 um 09:13
    • #3
    Zitat von fremder


    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.).

  • fremder
    3
    fremder
    Mitglied
    Reaktionen
    1
    Punkte
    71
    Beiträge
    11
    • 17. Januar 2009 um 15:02
    • #4

    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 :winking_face:

  • Daedalus
    10
    Daedalus
    Mitglied
    Reaktionen
    4
    Punkte
    949
    Beiträge
    172
    • 17. Januar 2009 um 16:28
    • #5
    Zitat von fremder

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


    Das ergibt sich aus der Art, wie die Zweierkomplement-Darstellung von negativen Zahlen funktioniert:

    http://de.wikipedia.org/wiki/Zweierkomplement
    (Kapitel "Darstellung und Umwandlung aus dem Dezimalsystem")

    [RIAA Radar]

  • fremder
    3
    fremder
    Mitglied
    Reaktionen
    1
    Punkte
    71
    Beiträge
    11
    • 17. Januar 2009 um 16:36
    • #6
    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 :winking_face:

  • Adok
    20
    Adok
    Mitglied
    Reaktionen
    49
    Punkte
    4.199
    Beiträge
    714
    • 17. Januar 2009 um 17:25
    • #7
    Zitat von fremder

    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.

  • Adok
    20
    Adok
    Mitglied
    Reaktionen
    49
    Punkte
    4.199
    Beiträge
    714
    • 19. Januar 2009 um 20:44
    • #8

    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:

    Code
    import std.stdio;
    
    
    void main ()
    {
      int i = 100 * 256 + 255;
      char c = i;
    
    
      writefln ("i: ", i);
      writefln ("c: ", cast (int) c);
    }
    Alles anzeigen

    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.)

  • Plantschkuh!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    Punkte
    6.173
    Beiträge
    1.181
    • 20. Januar 2009 um 19:14
    • #9
    Zitat von Adok

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

    Zitat von n869

    6.3.1.3 Signed and unsigned integers
    1 When a value with integer type is converted to another integer type other than _Bool, if
    the value can be represented by the new type, it is unchanged.
    2 Otherwise, if the new type is unsigned, the value is converted by repeatedly adding or
    subtracting one more than the maximum value that can be represented in the new type
    until the value is in the range of the new type.
    3 Otherwise, the new type is signed and the value cannot be represented in it; the result is
    implementation-defined.

    Alles anzeigen


    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*

  • Maximilian Rupp 27. Dezember 2024 um 00:26

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Tags

  • c++
  • c-kuh++
  • cast
  • character
  • integer

Rechtliches

Impressum

Datenschutzerklärung