Werte werden beim Casten mit 1 initialisiert



  • Guten Tag

    Ich habe hier ein merkwürdiges Phänomen.

    Ich bemomme von einer Funktion 32Bit Werte in einem 4 Felder großen char Array.
    Wenn ich dieses Char array auf eine DWORD Variable umwandle, werden die Variablen mit 1en initialisiert.

    Hier der Codeabschnitt:

    DWORD CConvert::CharArrayToDWord(char chDataArray[4])
    {
    	DWORD	dwVal =	(DWORD(chDataArray[0])		 | 
    					(DWORD(chDataArray[1]) <<  8)| 
    					(DWORD(chDataArray[2]) << 16)| 
    					(DWORD(chDataArray[3]) << 24));
    	return dwVal;
    }
    

    Bei diesem Codeabschnitt kommt es jetzt immer wieder vor, dass wenn z.B. chDataArray[0] den Wert 0xE3 enthält, DWORD(chDataArray[0]) zu 0xFFFFFFE3 wird.
    Dadurch stimmt natürlich das Ergebnis nicht mehr.

    Warum wird hier DWORD(chDataArray[0]) nicht zu 0x000000F3 ?
    Kann mir das bitte jemand erklären?

    Ich habe mir jetzt damit beholfen das ich alle Einträge nach der Konvertierung in DWORD mit 0x000000FF verunde, trotzdem würde mich interessieren wo hier die ganzen Einsen herkommen.

    mfg Bernhard

    Programmierumgebung:
    Visual Studio 2005

    OS:
    Win7



  • Du solltest mit 'unsigned char' arbeiten, denn negative 'char' (Bytes) werden beim Casten mit 0xFF erweitert (anstatt 0x00).



  • Das Witzige ist ja, das nicht immer mit F's erweitert wird.
    Meißtens wird mit 0en erweitert.

    Leider steckt die Funktion, die die Daten liefert in einer DLL die nicht von mir geändert werden kann.

    Da wird mir nichts anderes übrog bleiben als die Daten auszumaskieren.

    Danke für die Information.
    Ich muss jetzt nur noch jede Menge Programme überarbeiten, die diese DLL verwenden.