2016-08-03 9 views
3

私は以下のコードを持っています。なぜprintf内の否定が外部で否定を行うことと異なるのですか?printf内の否定

char d=0x04; 
printf("Value of d= %X\n",~d); 
d=~d; 
printf("Value of d= %X\n",d); 

結果はFFFFFFFBとFBです。 これは、printfの中で式が整数型(デフォルトのプロモーション)に変換され、したがって4バイトが表示されていると言うことができます!

答えて

3

~演算子を実行する前に、それを昇格したオペランドの型はintになります。これは、~0x04の結果がの幅が32ビットと思われるため、あなたのケースでは0xFFFFFFFBになることを意味します。

0xFFFFFFFBがprintfに渡された場合、それは既にそのタイプのintに昇格されずに出力されます。 0xFFFFFFFBバックdに割り当てられている場合

、実装定義の方法でcharintから変換が行われます。あなたの場合、結果の値は0xFBです。 dがprintfに渡されると、intに昇格され、intに昇格されると0xFBの値が維持され、印刷されます。