Char positiv/negativ ?!
-
Ich habe nochmal getestet mit folgenden Ergebnis:
DEZ HEX
127 0x7F
128 0xFFFFFF80Ein Char belegt genau 1 Byte, also zwei Hexa-Werte, aber hier werden es 8! Wie kann das sein. Aber das scheint der Schlüssel dazu zu sein, warum aus der 204 später eine -52 (256-52=204)! wird. Weiß jemand weiter?
Grüße
Franky
-
Zu wenig Information.
Du verschweigst irgendwas.
Zeig uns genau welche Zuweisung in deinem Programm nacheinander durchgegangen werden.
Da steckt vielleicht irgendwo ein vergessene implizite Typ-Konversion drin.
-
Hi scrontch,
Da steckt vielleicht irgendwo ein vergessene implizite Typ-Konversion drin.
Was meinst Du damit? Was könnte das denn sein, damit ich weiß, wo ich beim Suchen ansetzen kann? Alles heir zu posten ginge zu weit, da hier zwei Programme auf verschiedenen Rechnern miteinander kommunizieren, mit DLL- Einbindung u.s.w.
Danke.Grüße
Franky
-
Verwirrung komplett!
Also mit unsigned und signed komme ich nicht klar. Die F´s in der hexadezimal Darstelung sind klar. Sie deuten auf einen vorzeichen- behafteten Wert hin. Deshalb wird meine 204 auch immer als -52 ausgegeben.
Frage: Wie bekomme ich ein char-Byte mit 0xCC (nicht 0xFFFFFFCC)?
Dann habe ich noch andere Sachen ausprobiert.
int x=-52 ergibt 0xFFFFFFCC
unsigned int y=-52 ergibt auch 0xFFFFFFCCWenn mir das bitte jemand erklären könnte? Wie kann ich denn einen vorzeichenlosen Wert eine negative Zahl zuordnen???
Bitte um Aufklärung.Grüße
Franky
-
Der Witz ist ja der: Die binäre Darstellung von 204 und -52 in einem Byte ist ha*****arf dieselbe!
(eben 0xCC)
Und den arithmetischen Operationen + und - ist es schnurzegal ob ihre Operanden signed oder unsigned sind.
Auf binärer Ebene geht alles gleich gut durch.signed oder unsigned spielt nur eine Rolle für...
...Multiplikation/Division
...Vergleiche: z.B. if (x<0) etc.
...Ausgabe mit printf und dergleichen
...Typ-Umwandlungen (Integer-Promotion) (hier könnte Dein Problem stecken!!!)
z.B.
int x = char(0xCC); // = 0xFFFFFFCC = -52
int x = unsigned char(0xCC); // = 0x000000CC = 204signed/unsigned ist also "Interpretationssache", nichts weiter.
zur impliziten Typ-Umwandlung:
Damit meine ich, dass in irgendeinem Zwischenschritt vielleicht doch ein (signed) char verwendet wird.
Kann zum Beispiel über den Aufruf einer Funktion sein,
etwa
function(char bla) {...};
die du mit deinem unsigned char aufrufst.
(denn Fehler wird dir da keiner angezeigt!)
-
*lol* h-a-a-r-s-c-h-a-r-f!
-
Danke scrontch,
ich werde das gesamte Programm nochmal diesbezüglich untersuchen. Ich bin eigentlich davon ausgegangen, daß char auf unsigned char voreingestellt ist. So habe ich es wenigstens ind er Borland Hilfe gefunden. Apropos, hier noch ein interessanter Hinweis:
Konstanten, die aus einem einzigen Zeichen bestehen (beispielsweise `A`,
\\t
und\\007
), werden als int dargestellt. In diesem Fall gilt das niederwertige Bit als vorzeichenbehaftet, das heißt, wenn der Wert größer ist als 127 (Basis 10), wird das höherwertige Bit auf -1 (hexadezimal: 0xFF) gesetzt. Diese Automatik kann ausgeschaltet werden, indem man als standardmäßigen char-Typ unsigned char wählt.Die drei Zeichentypen char, signed char und unsigned char erfordern einen 8-Bit-Speicher (ein Byte). Per Voreinstellung behandelt C++Builder Zeichendeklarationen als mit Vorzeichen behaftet. Mit der Compiler-Option -K können Sie Zeichendeklarationen wie ohne Vorzeichen behandeln.
Ich melde mich wieder, wenn ich was gefunden habe. Danke.
Grüße
Franky
-
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) gespeichertNö.
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 ... 255Schade, 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