2017-02-20 6 views
1

私はバイトコードのために使用しているchar型の配列です。一つずつそれらをプリントアウトすることはあなたがここで見る同じヘクス値が得られるはずです:char配列が正しく初期化されていません

char toWrite[] = {'\x50','\x48','\xB8','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xFF','\xE0' }; 

私はループ内でこれらの値をプリントアウトしようとすると、しかし、彼らはマングルされています。代わりに表示されるのは:

50 48 ffffffb8 00 00 00 00 00 00 00 ffffffff ffffffe0 

これらの文字が間違って印刷されるのはなぜですか?私は、foreachループで繰り返していて、一つ一つの要素がcharが8ビット幅であり、符号付き整数型であり、ほとんどのシステムでは

cout << hex << (int)currentChar << endl; 
+0

1つのオプションは、 '(int型)(unsigned char型)currentChar、別々にキャストすることです' –

+1

Cスタイルのキャストを推奨しないでください。static_castは、コンパイラに意図を伝えるために常に優先されるべきです。 – zett42

答えて

3

に渡されます。 \xB8を格納すると、最も重要なビット1が作成され、負になります。また、intにキャストすると、負の値が返され、intが32ビットの場合、0xffffffb8になります。

あなたはunsigned charを使用する必要があります。

unsigned char toWrite[] = {/*...*/}; 

はまた、static_castはCスタイルのキャストよりも好ましい:

cout << hex << static_cast<int>(currentChar) << endl; 
関連する問題