Char positiv/negativ ?!



  • Ich bin eigentlich davon ausgegangen, daß char auf unsigned char voreingestellt ist.

    Ich kenne den Borland Builder nicht, nehme aber an, dass auch dort die Voreinstellung signed und nicht unsigned ist. (sowohl für char als auch int)
    (bestätigt für Visual C++)



  • So, hab nochmal nachgesehen und über alles nachgedacht.
    Auf der Senderseite wird die 204 in den Sendepuffer geschrieben. Da macht dann Borland laut meines o.g. Zitates einen vorzeichenbehafteten Wert draus, also 0xFFFFFFCC. Aber gesendet wird doch nur CC, weil 1Byte!

    Wieso wird dann in dem ersten Empfangspuffer (unsigned char) wieder 0xFFFFFFCC daraus gemacht? Wie bekomme ich aus diesem Wert wieder eine 204 ???
    Das kann doch nicht so schwierig sein(!?), oder?

    Grüße
    Franky



  • empfangen = gesendet & 0xFF



  • Ich dachte auf 32-Bit-Plattformen wird eh jede Variable in 32 Bit (also 4 Byte) gespeichert!? Also wird 0xCC als 0x000000CC gespeichert, wobei die Nullen ja durch irgendeinen beliebigen Wert ersetzt werden können. Der Compiler sorgt dafür, daß von den 32 Bit immer nur die least significant 8 Bits benutzt werden. Der Debugger zeigt dann wohl den REAL GESPEICHERTEN Wert.

    Sarge



  • Original erstellt von <Sgt. Nukem>:
    Ich dachte auf 32-Bit-Plattformen wird eh jede Variable in 32 Bit (also 4 Byte) gespeichert

    Nö.

    Franky: Führt das denn überhaupt zu Problemen in deinem Programm, oder machst du den ganzen Terz weil der Debugger das nicht so anzeigt wie du's willst?



  • Das Problem ist, dass ich nicht mehr an die ursprüngliche 204 herankomme. Egal, was ich mache, das Ergebnis ist -52.

    Also in dem Empafngspuffer steht z.B. an der Stelle 5 der Wert 0xFFFFFFCC.

    unsigned char ReceiverBuf[10];
    ...
    Receive();
    ...
    int x=ReceiveBuff[4];
    

    Dann ist x nicht 204, sondern -52. Und damit kann ich natürlich nichts anfangen.

    Grüße
    Franky

    [ Dieser Beitrag wurde am 27.02.2003 um 20:17 Uhr von Franky editiert. ]

    [ Dieser Beitrag wurde am 27.02.2003 um 20:18 Uhr von Franky editiert. ]



  • *seufz* OK compilier bitte bei dir folgendes Programm:

    #include <stdio.h>
    
    int main() {
      unsigned char ReceiverBuf[10];
      int x;
    
      ReceiverBuf[4] = 204;
    
      x = ReceiverBuf[4];
      printf("%d\n", x);
    }
    

    Und sag mir, ob die Ausgabe 204 ist.

    Wenn sie das nicht ist, hat dein Compiler ein Problem. Wenn doch, dann solltest du dein Programm so weit reduzieren, dass es entweder hier postfähig ist, oder der Fehler verschwindet. Im letzteren Fall hast du den Fehler dann selbst gefunden.



  • Tja, was soll ich sagen...

    Das Ergebnis ist 204, wie erwartet. Sogar der Hex-Wert mit 0xFFFFFFCC ist derselbe. Ich mache aber in meinem Programm genau dasselbe. So viel kann man da ja eigentlich nicht falsch machen.

    Tja, da muß ich wohl weitersuchen. Auch wenn ich das heute schon den ganzen tag getan habe. Trotzdem Vielen Dank für Eure Hilfe.

    Grüße
    Franky



  • In Bashar's Beispiel wurde ein SIGNED int benutzt, warum nimmst Du dann nicht einfach statt einem unsigned int Array ein int Array??



  • Alles klar, Fehler gefunden!
    Der Punkt, an dem dem der Fehler produziert wurde lag ja in meiner DLL. Diese war aber mit der falschen Host-Anwendung verbunden.

    Ich hatte nämlich in meiner richtigen Host-Anwendung alle char- Arrays in unsigned char- Arrays verändert und konnte mir daher diesen Fehler nicht erklären.

    Da aber die DLL mit der alten Anwendung mit dem char-Arrays zusammengearbeitet hat, wurden hier vorzeichenbehafteten Werte genutzt.

    Also bleibt festzuhalten: char -128 ... 127
    unsigned char 0 ... 255

    Schade, dass dies nicht so ganz mit der Borland Hilfe überein stimmt. Da wird ja gesagt, daß mit der Compiler-Option -K der Ausdruck char auf unsigned char voreingestellt wird. Das hätte mir einiges erspart.

    Trotzdem vielen Danke an alle. Es ist wirklich toll, wie einem hier geholfen wird, auch wenn man sich nicht gleich verständlich ausdrückt.

    ...und das nächste Problem kommt bestimmt.

    Grüße
    Franky


Anmelden zum Antworten