2012-01-17 3 views
8
int m=32 
printf("%x" , ~m); 

出力がffdfあると~出力せずに20です。 %x~の重要性は何ですか?意義と、この文の〜

+6

あなたは、そうでない人の古い質問のいくつかを通過し、最良の答えを受け入れることをお勧めします役に立つ回答として提供したくないかもしれません。 – brc

答えて

19

~演算子はビット単位で否定されます。 mの値のビット単位の否定が出力されます。 %xは、printfがその値を16進形式で出力することを意味します。

したがって、値0xffdfは値0x20(32)の否定です。

値32(ビットは以下のようになりINT):

0000 0000 0010 0000 

そのビット単位の否定は次のようになります。

1111 1111 = 0xff 

そして:

ので、理にかなって

1111 1111 1101 1111 

1101 1111 = 0xdf 
+1

ありがとうございました。 –

1

%xは、xの値を16進数で表示することを意味します。

6

%xは、の値を16進数で表示する必要があることを示すprintf formatです。

~bitwise NOTで、整数のすべてのビットを反転します。

声明:

printf("%x", m); 

が出力0x20として20 = 32小数点が表示されます。

声明:0xffdf0x20のビット単位の逆数であるとして

printf("%x", ~m); 

は出力ffdfを表示します。

それはバイナリでビット単位の否定を可視化するために、より多くの意味を作ることがあります。

Base 10:   32     65503 
Base 16:  0x20    0xFFDF 
Base 2: 0000000000100000 1111111111011111 
1

〜32 = -33

+1

* what *結果を取得するには? –

+0

細部にこだわってください – Omar

+1

確かに4294967263 –

1

に結果を得るためにunsigned int型を使用することがxはおそらくunsignedを宣言されていている必要があることを意味しintではなく

"%x" printf形式は、unsigned int引数を必要とし、その値を16進数(16進数)で出力します。 int引数で安全に使用できます。の値は、intまたはunsigned int(つまり、0 .. INT_MAX)のいずれかの値の範囲内で値を指定できます。"%x"を負の値intの値で使用すると、このコードフラグメントは厳密には未定義の動作をしますが、実際の動作は合理的に一貫性があります。

C標準は言う:

オペレータ(つまり、結果の各ビットは、場合にのみ 場合に設定されているその (促進)オペランドのビットごとの補数である結果変換されたオペランドの対応するビットは設定されません)。

オペランドの表現で定義されていることに注意してください。

出力は、2の補数符号付き整数を持つシステムを使用していることを示します。ここでは、intはほんの16ビットですが、これはまれです。 (あなたは古代のターボCコンパイラまたは類似のものを使用していますか?)私のシステムでは、このプログラム:

#include <stdio.h> 
int main(void) { 
    int m = 32; 
    printf("%x\n" , ~m); 
    return 0; 
} 

は、この出力を生成します

ffffffdf 

は(私は必要な#include <stdio.h>を追加したことに注意してくださいmの宣言にセミコロン。)

2

~シンボルビット単位NOT、又は補数演算子を表し; 各ビットの論理否定を行う単項演算は、与えられた2進値の1の補数を形成します。

32はバイナリでは00100000、バイナリでは〜32は11011111(または10進数では223)です。

printf関数の%xオプションは、(小文字を使用して)符号なしの16進数形式を表示します。

ので、

printf("%x", m); // displays the hexadecimal value of 32 (00100000), "20" 

printf("%x", ~m); // displays the hexadecimal value of ~32 (11101111), "ffdf" 


[ソース]
http://en.wikipedia.org/wiki/Bitwise_operation#NOT
http://en.wikipedia.org/wiki/Hexadecimal
http://en.wikipedia.org/wiki/Printf_format_string

関連する問題