0

したがって、次のコードを使用して整数を char[] または unsigned char[] に入れています

(unsigned???) char test[12];

test[0] = (i >> 24) & 0xFF;
test[1] = (i >> 16) & 0xFF;
test[2] = (i >> 8) & 0xFF;
test[3] = (i >> 0) & 0xFF;

int j = test[3] + (test[2] << 8) + (test[1] << 16) + (test[0] << 24);

printf("Its value is...... %d", j);

タイプ unsigned char と値 1000000000 を使用すると、正しく印刷されます。

タイプ char (同じ値) を使用すると、98315724 が出力されますか?

それで、問題は本当に何が起こっているのか説明できる人はいますか??


2 つの異なる数値のバイナリを調べても、何が起こっているのかまだわかりません。MSB が負の値を示すために 1 に設定された場合、signed だと思いました (ただし、負の文字? wth?)

バッファーに何を挿入するか、内容をどのように解釈するかを明示的に伝えているので、なぜこれが起こるのかわかりません。

調べた内容を明確にするために、以下にバイナリ/16 進数を含めました。

11 1010 1001 1001 1100 1010 0000 0000 // 983157248 のバイナリ

11 1011 1001 1010 1100 1010 0000 0000 // 1000000000 のバイナリ

3 A 9 9 CA 0 0 // 983157248 の 16 進数

3 B 9 ACA 0 0 // 1000000000 の 16 進数

4

3 に答える 3

0

Kerrek SB による回答に加えて、次の点を考慮してください。

コンピュータは (ほとんどの場合)負の数に対して2 の補数表記と呼ばれるものを使用し、上位ビットは「負の」インジケータとして機能します。コンピューターが符号付きビットを特別に処理することを考慮して、符号付き型でシフトを実行するとどうなるか自問してください。

左側のオペランドに負の値がある場合、左シフト操作が未定義の動作を呼び出すのはなぜですか? ヒントについては、ここ StackOverflow を参照してください。

于 2013-06-06T18:11:07.460 に答える