problem mit BYTE



  • typedef unsigned __int8 BYTE;
    
    BYTE niederwertigerTeil ( BYTE input )
    {
      return ( input & 0x0f );
    }
    
    ...
    
    cout << niederwertigerTeil ( 0xee ) << endl;
    

    [/cpp]

    Sollte 0x0e ergeben, ich kriege aber in der Konsole (Windows) eine Note (Symbol) angezeigt. Woran liegt das?

    Wenn ich

    cout << ( 0xee & 0x0f ) << endl;
    

    schreibe, dann wird das richtige Ergebnis : 14 angezeigt.

    Ich bin mir sicher ihr könnt helfen, danke!



  • cout << static_cast<int>(niederwertigerTeil ( 0xee )) << endl;
    


  • Das liegt daran, dass Du einmal das Zeichen mit dem ASCII-Code 0x0e ausgibst und einmal eine Integer-Variable 0x0e. Korrigiere Deinen Code zum Beispiel zu

    cout << unsigend( niederwertigerTeil ( 0xee ) ) << endl;
    

    oder schau Dir mal den BytePrinter in meinem Posting in diesen Thread an.

    Gruß
    Werner



  • @Werner Salomon

    ich verstehe den Code leider nicht. 😞

    @Neku

    static_cast<int>() funktioniert zwar, aber warum nicht static_cast<unsigned __int8>?

    Bitte habt Verständnis für meine dämlichen Fragen, aber ich bin Anfänger.



  • NULL_HIRN schrieb:

    static_cast<int>() funktioniert zwar, aber warum nicht static_cast<unsigned __int8>?

    nun, deshalb:

    Werner Salomon schrieb:

    Das liegt daran, dass Du einmal das Zeichen mit dem ASCII-Code 0x0e ausgibst und einmal eine Integer-Variable 0x0e.

    Nochmal ausführlich: Die Klasse std::ostream - und das cout ist ein Objekt eben dieser Klasse - stellt mehr als einen sogenannten Streaming-Operator zur Verfügung. Nämlich u.a.

    ostream& operator<<( char x );
    // und 
    ostream& operator<<( int x );
    

    beide machen was anderes.

    Dazu muss man zunächst wissen dass sich in C++ im Gegensatz zu C Funktionen auch unterscheiden, wenn sie zwar den gleichen Namen aber unterschiedliche Signaturen haben. Zum Beispiel ist

    void func( int x );
    // was anderes als
    void func( unsigned x );
    

    deshab kann der Compiler auch die beiden Streaming-Operatoren unterscheiden. Bei

    unsigend char x = 0x0e;
    cout << x;
    

    passiert also was anderes als bei

    int x = 0x0e;
    cout << x;
    

    Im ersten Fall wird der Wert x als Zeichen interpretiert - z.B. ein 0x31 wäre eine '1' - und im zweiten Fall wird x als eine Zahl interpretiert - dann wäre 0x31 eine 49.

    Gruß
    Werner



  • Ich hab's mal durchgetestet und auf relativ gut verstanden.
    Danke dir. :))


Anmelden zum Antworten