3

Java で Android 2.3.3 アプリケーションを開発しています。

次のコードがあります。

short CRCAux = 0xffff;

この値を短くキャストする必要があるという警告がEclipseで表示されます。

short CRCAux = (short) 0xffff;

iOS アプリケーションを Android に移行していますが、iOSCRCAuxではUInt16.

コンパイラがその値を short にキャストする必要があるのはなぜですか? short は signed int 16bit データ型ですか?

4

1 に答える 1

4

0xFFFF のようなリテラルは、Java コンパイラによって int 型であると推定されます。int 値 0x0000FFFF が short に適切に適合しないため、ここで警告が表示されるのは非常に正しいです (コンパイラは、この特別なケースで上位ゼロの切り捨てを気にしないことを認識できません)。

この場合、16 ビット値を符号付きの値として書き込むと、コンパイラはキャストなしでそれを受け入れます。

短い CRCAux = -1;

short 型は、uint16 の値を格納するために使用できます (16 ビットの 2 の補数は、結局のところ 16 ビットであり、これらのビットの解釈の問題です)。

そうは言っても、Javaはこれらの16ビットが符号付き2の補数を表すと想定しているためです。多くの演算子 (シフト、乗算/除算、より大きい/小さい比較) では、非常に異なるセマンティクスが得られます。自分が何をしているのか正確にわかっていない限り、移植しているコードが壊れる可能性が高くなります。Char は、望ましい「符号なし」の動作を提供するため、この場合により適しています。

于 2012-07-17T14:18:11.193 に答える