答えて
~
演算子はビット単位で否定されます。 m
の値のビット単位の否定が出力されます。 %x
は、printf
がその値を16進形式で出力することを意味します。
したがって、値0xffdf
は値0x20
(32)の否定です。
値32(ビットは以下のようになりINT):
0000 0000 0010 0000
そのビット単位の否定は次のようになります。
1111 1111 = 0xff
そして:
ので、理にかなって1111 1111 1101 1111
1101 1111 = 0xdf
ありがとうございました。 –
%xは、xの値を16進数で表示することを意味します。
%x
は、の値を16進数で表示する必要があることを示すprintf
formatです。
~
はbitwise NOTで、整数のすべてのビットを反転します。
声明:
printf("%x", m);
が出力0x20
として20
= 32
小数点が表示されます。
声明:0xffdf
は0x20
のビット単位の逆数であるとして
printf("%x", ~m);
は出力ffdf
を表示します。
それはバイナリでビット単位の否定を可視化するために、より多くの意味を作ることがあります。
Base 10: 32 65503
Base 16: 0x20 0xFFDF
Base 2: 0000000000100000 1111111111011111
に結果を得るために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
の宣言にセミコロン。)
~
シンボルビット単位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
あなたは、そうでない人の古い質問のいくつかを通過し、最良の答えを受け入れることをお勧めします役に立つ回答として提供したくないかもしれません。 – brc