13

誰かがこの次のステートメントの理由を説明できますか:

short value = (short) 100000000;
System.out.println(value);

私に与えます:

-7936

Java の short の最大値が 32767 であることを知っていますか?

4

3 に答える 3

23

あなたの値が 1 億だとすると、-7936 になります。1 億を 100 万に変更すると、16960 しか取得できません。

その理由は、値が -32768 から +32767 に制限されており、Java が(縮小プリミティブ変換、JLS 5.1.3short )にキャストするときに最下位 16 ビットのみを保持するためです。事実上、この操作: 100 万 mod 2^16 (a の 16 ビット) は 16960 です。shortshort

于 2013-09-17T22:23:08.480 に答える
4

あなたが行った方法は、同じメモリ位置で少数のビットを再解釈するだけです。それらは変更されません。

max関数およびmin関数を使用して、値が を超えたときを検出し、shortそれが発生したときに short の最大値または最小値を割り当てたいと思うでしょう。

int n = 1000000;
short value = n > Short.MAX_VALUE ? Short.MAX_VALUE : n < Short.MIN_VALUE ? Short.MIN_VALUE : (short)n;

更新:よりコンパクトに:

import static java.lang.Math.max;
import static java.lang.Math.min;

// ...

value = (short)min(max(value, Short.MIN_VALUE), Short.MAX_VALUE);
System.out.println(value);
于 2013-09-17T22:23:11.840 に答える