Vergleich zeigt bei gleichen Werten ungleich.

23/02/2009 - 00:34 von Martin Freiberg | Report spam
Hallo,


Ich habe hier ein kleines Problem. Hier nur die relevanten Zeilen.
Im eigentlichen Programm wird "merk" errechnet.
Fall wichtig, es ist ein Kernelmodul an dem ich werkle. :)


void handshake (char flag, char signal) {

unsigned char merk;

// diverse Programmzeilen ...

merk = 0x80; // Inhalt wird normal errechnet

if ((merk & flag) == signal) {

// tue hier wenn true

} else {

// tue hier wenn false

printk (KERN_INFO ":Handshake And=%X Sig=%X ", merk & flag, signal);

}
}


// hier ein Programmteil

handshake (0x80,0x80);

// weitere Programmzeilen


Warum ergibt der Vergleich in der Funktion immer false?
Es wird immer der Programteil nach dem else ausgeführt.

Im Log steht:
:Handshake And=0x80 Sig=0x80


Sollte so doch nicht vorkommen, oder?


Gruß
Martin
 

Lesen sie die antworten

#1 Alexander Bartolich
23/02/2009 - 00:58 | Warnen spam
Martin Freiberg schrieb:
[...]
void handshake (char flag, char signal) {



Den Datentyp "char" für Parameter zu verwenden ist meist grober Unfug.
Zum einem weil die Parameterübergabe sowieso ein ganzes Register bzw.
einen ganzen int auf dem Stack braucht.

unsigned char merk;

// diverse Programmzeilen ...

merk = 0x80; // Inhalt wird normal errechnet

if ((merk & flag) == signal) {



Und zum anderen muss man dann sehr aufpassen, dass einem die Integer-
Promotion nicht ein Ei legt. »merk« und »flag« sind nicht vom selben
Typ, also werden die Werte auf die Größe eines int aufgeblasen.

Bei einem »unsigned char« ist nicht so tragisch, da wird einfach links
mit 0-Bits angefüllt. Bei einem vorzeichenbehafteten 8-Bit-char ent-
spricht 0x80 allerdings dem Wert -128, in einem 32-Bit-int entspricht
der Wert -128 der Bitfolge 0xffffff80, und der Ausdruck

((0x00000080 & 0xffffff80) == 0xffffff80)

ist natürlich immer false.

seq 0 1 99 | xargs -I. echo 'Romani Ite Domum!'

Ähnliche fragen