0

私は C++ に慣れていないので、crackme のソースを調べていたときに、短い -223 または

foo = 0xde;// 222 unarfoo = ~(foo);// -223

文字「!」に変換されていました。このコード行を実行すると...

cout << (char)(~(foo));// outputs "!"

ascii は char に負の数を使用しないため、これは明らかに ascii 変換ではありません。Java で負の short/int を char に変換しようとしたとき、これは C のコンパイルに限定されたものだと思います。得たのは「?」です。

正確に何が起こっているのか、そしてその理由について詳しく説明できる人はいますか? とても有難い!

4

4 に答える 4

1

0xde = 11011110b, ~(0xde) = 00100001b = 0x21 16 進数で、ASCII テーブルでは !

したがって、C++ の ~ 演算子はビットごとの否定です

于 2012-07-15T21:16:23.193 に答える
0

Java は文字に UNICODE (64 ビット値) を使用しているため、-233 を試してみると、UNICODE テーブルの上部近くになり、システムで表現できない可能性が高くなります。

C で見たプログラムcharは、8 ビット幅のデータ型を使用していました。!したがって、 ~(-233) は 33 (または文字)とほぼ同じ (ビット単位) です。

于 2012-07-15T21:19:02.850 に答える
0

foo0xde または 0x000000de です。

~foo0xffffff21 です。

(char)~foo0x21 (感嘆符)

于 2012-07-15T21:19:07.497 に答える
0

何が起こっているかというと、プロセッサが 2 の補数演算と負の数を処理する方法です。ケースはそれらが同じであるということです: 文字はほとんどの場合8バイトであるため、得られるものは次のとおりです:

フー= 222; unarfoo = ~foo = -(255 - foo) = - (255 - 222) = -233

したがって、本質的には、char を符号付きまたは符号なしとして解釈するだけの問題です。

于 2012-07-15T21:19:55.037 に答える