Cでは、計算が行われる前に、int
より小さいタイプのほとんどの式の値がより広いタイプに昇格されます。 int
が幅の狭いタイプのすべての値を保持できるだけの幅を持つ場合は、int
に昇格します。それ以外の場合はunsigned int
にプロモートされます。
この場合、int
は、unsigned char
のすべての値を保持するのに十分な幅であるため、値はint
に昇格されます。
pktNum
(したがって、促進されたpktNum
)は、0以上255以下の値をとることができます。これは、!=
演算子の左側に使用される値です。
invPktNum
も同様に0〜255の値を持つことができます。この値はint
に昇格され、ビット単位でネゲートされます。このビット単位の否定の結果は、符号ビットがネゲートされるため、常にの負数の数値になります。これは、!=
オペレータの右側で使用される値です。
負の数値は昇格されたpktNum
と等しいことはありませんので、条件は常にtrueです。
あなたが実際にする計算を実行するには、あなたが否定した後、下位8ビットをマスクする必要があります。
if (pktNum != (~invPktNum & 0xff)) {
return 1;
}
または代わりに、あなたはちょうどあなたが興味を持っているのビットを否定することができます
if (pktNum != (invPktNum^0xff)) {
return 1;
}
出典
2010-11-22 23:44:39
caf
ああ、これはそうだった。新しいことを学んだ。あなたの素晴らしく詳細な答えをありがとう! – Justin
@ FallSe7en:すばらしい混乱の世界であるCコードのデバッグへようこそ。コンパイラの警告なしにそのバグを見つけることを想像してみてください! –