Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : C: Verständnisproblem bei Bitoperatoren



ContainerDriver
08-01-2008, 17:29
Hallo,

ich habe folgenden Testcode:


#include <stdio.h>

//0....0 1000 0000 (int)

//1000 0000 (char)
//-> int
//0....0 1000 0000 (int)

int main(void)
{
int a=0x80;
char b=0x80;

printf("====%d\n",a);
printf("----%d\n",(int)b);

if ((a & b) != 0) //*
{
printf("&\n");
}

if ((a ^ b) != 0) //*
{
printf("^\n");
}

return 0;
}
.

Als Ausgabe erhalte ich:


====128
-----128
&
^.

Diese ist für mich unverständlich.
Ich nehme an, dass bei den mit Stern markierten Stellen eine Umwandlung von char nach int (für b) durchgeführt wird. Die printf-Anweisung weiter oben bestätigt, dass nach der Umwandlung beide Variablen den Wert 0x80/128 haben.
Warum erfolgt dann aber die Ausgabe des "^", bzw. warum liefert das XOR einen Wert ungleich 0? Die Bitmuster müssten doch gleich sein (was die Ausgabe des "&" demonstriert)?
Verwende ich bei den Bitoperatoren manuelle Casts (((char)a & b) != 0 und ((char)a ^ b) != 0), erfolgt die erwartete Ausgabe.

Gruß, Florian

EDIT: Holla, durch die Formatierung im Forum habe ich erst gesehen, dass die Ausgabe beim printf ja "-128" heißt. Dann hatte der Professor doch unrecht.

jeebee
08-01-2008, 17:36
Als Ausgabe erhalte ich:


====128
-----128
&
^.

Diese ist für mich unverständlich.
Ich nehme an, dass bei den mit Stern markierten Stellen eine Umwandlung von char nach int (für b) durchgeführt wird. Die printf-Anweisung weiter oben bestätigt, dass nach der Umwandlung beide Variablen den Wert 0x80/128 haben.
Falsch.
(int)b == 0xffffff80 == -128 falls Zweierkomplement als Codierung verwendet wird.

ContainerDriver
08-01-2008, 17:40
Ja, habe ich auch gerade entdeckt. ;)
Somit ist alles klar.

Danke.

quinte17
09-01-2008, 17:25
wie die interne char darstellung ist, hängt vom compiler ab.
da es compiler-defined ist ob char nun als signed oder unsigned behandelt wird.
in deinem fall ist der char signed, und wird durch deinen compiler signed-extended auf einen int erweitert. (dezimaler wert bleibt gleich, binäre darstellung ist anders)

greetz