誰かがこの次のステートメントの理由を説明できますか:
short value = (short) 100000000;
System.out.println(value);
私に与えます:
-7936
Java の short の最大値が 32767 であることを知っていますか?
あなたの値が 1 億だとすると、-7936 になります。1 億を 100 万に変更すると、16960 しか取得できません。
その理由は、値が -32768 から +32767 に制限されており、Java が(縮小プリミティブ変換、JLS 5.1.3short
)にキャストするときに最下位 16 ビットのみを保持するためです。事実上、この操作: 100 万 mod 2^16 (a の 16 ビット) は 16960 です。short
short
あなたが行った方法は、同じメモリ位置で少数のビットを再解釈するだけです。それらは変更されません。
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);