2010-11-22 9 views
6

次のコードをコンパイルすると、私のコンパイラは次の行が常にtrueであると不満を表明します。私はinvPktNumが実際にpktNumの逆であることを確認しようとしているこの条件は常に真ですか? (pktNum!= invPktNum)

if (pktNum != ~invPktNum) { 
    return 1; 
} 

...私は!=オペレータの障害のある理解しているかもしれないと思います。そうでない場合はすぐに終了し、そうでない場合は通常どおり処理を進めます。

pktNumは0x01の符号なしの文字で、invPktNumは比較時に0xFEの符号なしの文字です。

誰でも私を啓発できますか?前もって感謝します!

答えて

10

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; 
} 
+0

ああ、これはそうだった。新しいことを学んだ。あなたの素晴らしく詳細な答えをありがとう! – Justin

+0

@ FallSe7en:すばらしい混乱の世界であるCコードのデバッグへようこそ。コンパイラの警告なしにそのバグを見つけることを想像してみてください! –

0

あなたは8ビットの値を見ています。私はpktNumとinvPktNumは32ビットの値なので、0x000000feと0xfffffffeを比較しているはずです。

invPktNum = ~pktNum 

その後、あなたの比較は同等です:常にfalseである

if (pktNum != ~(~pktNum)) { 

または

if (pktNum != pktNum) { 

以下を想定し

+0

私が16ビットマイクロコントローラのコードを書いているのなら、unsigned charは16ビットですか?私は無署名のcharがちょうど8ビットだと思っていました。 – Justin

+0

'char'は' 'から' CHAR_BIT'と同じ幅であると考えられます(私は思う)。 – dennycrane

+0

どのようなタイプですか?あなたはあなたの質問にそれを指定していません。 – EboMike

-1

。 invPktNumがあなたのコードには表示されていない別の定義を持っていない限り。

+1

コンパイラは常に* true *であると不平を言います。 – caf

+0

元の質問にinvPktNumとpktNumの完全な宣言を追加できますか? – uesp

0

おそらく、単純型の独立したテストでは、次のとおりです。

if (0 == (pktNum & pkNum)) { 

等しいS:迅速http://codepad.org/nziOGYJGでテスト

if (0 == (0xfe & 0x01)) { 

が署名し、複数のとunsigned long型/ int型のタイプで動作するようです。

誰でもコメントがありますか?

+1

これは、(意図された)オリジナルと同じセマンティクスを与えません。これは、入力の1つが0である場合に限り、真となることができます。 'if((pktNum^invPktNum)!= 0xff)'は動作しますが、それは明らかだとは思わない。 – caf

+0

@cafあなたの考えをありがとう。私はそれが明確でないことに同意する。 –

関連する問題